जावास्क्रिप्ट या jQuery का उपयोग करके किसी सरणी के अंदर मौजूद वस्तु का मूल्य कैसे बदलें?


204

नीचे दिया गया कोड jQuery UI स्वतः पूर्ण से आता है:

var projects = [
    {
        value: "jquery",
        label: "jQuery",
        desc: "the write less, do more, JavaScript library",
        icon: "jquery_32x32.png"
    },
    {
        value: "jquery-ui",
        label: "jQuery UI",
        desc: "the official user interface library for jQuery",
        icon: "jqueryui_32x32.png"
    },
    {
        value: "sizzlejs",
        label: "Sizzle JS",
        desc: "a pure-JavaScript CSS selector engine",
        icon: "sizzlejs_32x32.png"
    }
];

उदाहरण के लिए, मैं jquery-ui के अवर मूल्य को बदलना चाहता हूं । मैं उसे कैसे कर सकता हूँ?

इसके अतिरिक्त, डेटा प्राप्त करने का एक तेज़ तरीका है? मेरा मतलब है कि किसी वस्तु को उसके डेटा को लाने के लिए एक नाम दें, जैसे कि किसी सरणी के अंदर की वस्तु? तो यह कुछ इस तरह होगाjquery-ui.jquery-ui.desc = ....


आपको सिंटैक्स का उपयोग करने के लिए सरणी को एक जावास्क्रिप्ट ऑब्जेक्ट में बदलना होगा projects["jquery-ui"].desc। क्या केवल अच्छे सिंटैक्स प्राप्त करने के प्रयास के लायक होगा?
Frédéric Hamidi

मैंने आपके नवीनतम प्रश्न के साथ अपना समाधान अपडेट किया है। और आप "प्रोजेक्ट्स। Jquery-ui.desc" नोटेशन का उपयोग कर सकते हैं।
एस्टन

जवाबों:


135

आपको सरणी में खोजना होगा:

function changeDesc( value, desc ) {
   for (var i in projects) {
     if (projects[i].value == value) {
        projects[i].desc = desc;
        break; //Stop this loop, we found it!
     }
   }
}

और इसका उपयोग करें

var projects = [ ... ];
changeDesc ( 'jquery-ui', 'new description' );

अपडेट करें:

इसे तेजी से प्राप्त करने के लिए:

var projects = {
   jqueryUi : {
      value:  'lol1',
      desc:   'lol2'
   }
};

projects.jqueryUi.desc = 'new string';

(फ्रैड्रिक की टिप्पणी के अनुसार आपको ऑब्जेक्ट कुंजी में हाइफ़न का उपयोग नहीं करना चाहिए, या आपको "jquery-ui" और परियोजनाओं का उपयोग करना चाहिए ["jquery-ui"] संकेतन।)


क्या डेटा प्राप्त करने का बहुत तेज़ तरीका है? मेरा मतलब है कि ऑब्जेक्ट को अपना डेटा प्राप्त करने के लिए एक नाम दें। बस सरणी के अंदर ऑब्जेक्ट की तरह। तो, क्या मैं उस तरह से उपयोग कर सकता हूं: jquery-ui.jquery-ui.desc = ....
qinHaiXiang

2
-ऑब्जेक्ट नाम में हाइफ़न के कारण आपका अपडेट काम नहीं करेगा । आपको लिखना होगा "jquery-ui": {}और projects["jquery-ui"].descक्रमशः।
फ्रैडरिक हमीदी

धन्यवाद, मुझे नहीं पता था कि।
एस्टन

अबे कुर के जवाब को देखो, यह सही है, यह और
माताएं

233

यह काफी सरल है

  • findIndexविधि का उपयोग कर के सूचकांक का पता लगाएं ।
  • इंडेक्स को वेरिएबल में स्टोर करें।
  • इस तरह से एक सरल अद्यतन करें: yourArray[indexThatyouFind]

//Initailize array of objects.
let myArray = [
  {id: 0, name: "Jhon"},
  {id: 1, name: "Sara"},
  {id: 2, name: "Domnic"},
  {id: 3, name: "Bravo"}
],
    
//Find index of specific object using findIndex method.    
objIndex = myArray.findIndex((obj => obj.id == 1));

//Log object to Console.
console.log("Before update: ", myArray[objIndex])

//Update object's name property.
myArray[objIndex].name = "Laila"

//Log object to console again.
console.log("After update: ", myArray[objIndex])


2
विधि ()पर डबल का कोई कारण findIndex?
टेराकोस

3
यह myArray को म्यूट करेगा।
बिमल ग्राम

1
हां, लेकिन अगर आप म्यूट नहीं करना चाहते हैं। [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], myArray.slice(objIndex + 1))]
उमैर अहमद

1
@UmairAhmed उपरोक्त कोड नहीं होना चाहिए [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], ...myArray.slice(objIndex + 1))]? मुझे लगता है कि उर दूसरे दीर्घवृत्त को याद कर रहा है।
क्रेग

1
प्यार कितना साफ है!
tdelam

58

मूल डेटा को म्यूट किए बिना ES6 रास्ता ।

var projects = [
{
    value: "jquery",
    label: "jQuery",
    desc: "the write less, do more, JavaScript library",
    icon: "jquery_32x32.png"
},
{
    value: "jquery-ui",
    label: "jQuery UI",
    desc: "the official user interface library for jQuery",
    icon: "jqueryui_32x32.png"
}];

//find the index of object from array that you want to update
const objIndex = projects.findIndex(obj => obj.value === 'jquery-ui');

// make new object of updated object.   
const updatedObj = { ...projects[objIndex], desc: 'updated desc value'};

// make final new array of objects by combining updated object.
const updatedProjects = [
  ...projects.slice(0, objIndex),
  updatedObj,
  ...projects.slice(objIndex + 1),
];

console.log("original data=", projects);
console.log("updated data=", updatedProjects);

55

सबसे अच्छा समाधान, ES6 के लिए धन्यवाद।

यह उस ऑब्जेक्ट के बदले हुए विवरण के साथ एक नया सरणी देता है जिसमें "jquery-ui" के बराबर मूल्य होता है।

const newProjects = projects.map(p =>
  p.value === 'jquery-ui'
    ? { ...p, desc: 'new description' }
    : p
);

1
वास्तव में सबसे अच्छा समाधान! धन्यवाद।
फ्रेडरिको सेसर

1
@FrederikoCesar नहीं सभी मामलों में, से अधिक प्रत्येक वस्तु की लागत अधिक पुनरावृत्ति सरणी टुकड़ा करने की क्रिया से और प्रसार ऑपरेटर का उपयोग नई वस्तु इंजेक्षन
मगद मोहम्मद

क्या होगा यदि आप मक्खी पर मूल्य बदलना चाहते हैं? एक और संस्करण बनाने के बिना? सबसे अच्छा तरीका सूचकांक विधि है: const targetIndex = summerFruit.findIndex (f => f.id === 3);
थानिस

37

आप सरणी पर पुनरावृति करने के लिए $ .each () का उपयोग कर सकते हैं और उस वस्तु का पता लगा सकते हैं जिसमें आप रुचि रखते हैं:

$.each(projects, function() {
    if (this.value == "jquery-ui") {
        this.desc = "Your new description";
    }
});

36

अतिरिक्त पुस्तकालयों का उपयोग किए बिना मानचित्र का उपयोग करना सबसे अच्छा समाधान है।

const state = [
{
    userId: 1,
    id: 100,
    title: "delectus aut autem",
    completed: false
},
{
    userId: 1,
    id: 101,
    title: "quis ut nam facilis et officia qui",
    completed: false
},
{
    userId: 1,
    id: 102,
    title: "fugiat veniam minus",
    completed: false
},
{
    userId: 1,
    id: 103,
    title: "et porro tempora",
    completed: true
}]

const newState = state.map(obj =>
    obj.id === "101" ? { ...obj, completed: true } : obj
);

19

यह आसानी से अंडरस्कोर / लॉश लाइब्रेरी के साथ पूरा किया जा सकता है:

  _.chain(projects)
   .find({value:"jquery-ui"})
   .merge({desc: "new desc"});

डॉक्स:
https://lodash.com/docs#find
https://lodash.com/docs#merge


क्या होगा यदि 'jquery-ui' खोज फ़ंक्शन द्वारा नहीं मिला है?
मिका

संपत्ति 'खोज' 'LoDashExplicitArrayWrapper' पर मौजूद नहीं है
एंड्रयूबेंजामिन

ऐसे अनुक्रमों के परिणाम को _ # मान से अपरिवर्तित किया जाना चाहिए। lodash.com/docs/4.17.4#chain .value()
p0k8_

17

आप अपने उदाहरण में .find का उपयोग कर सकते हैं

   var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

let project = projects.find((p) => {
    return p.value === 'jquery-ui';
});

project.desc = 'your value'

गजब का! +1
माइक मुस्नी

12

आपको उस वस्तु के सूचकांक को जानने की जरूरत है जिसे आप बदल रहे हैं। तो इसका बहुत आसान है

projects[1].desc= "new string";

8

मुझे लगता है कि यह तरीका बेहतर है

const index = projects.findIndex(project => project.value==='jquery-ui');
projects[index].desc = "updated desc";

अपने में findIndexआप तुलना करने के बजाय एक मान दे रहे हैं
avalanche1

6

निम्नलिखित डेटा को देखते हुए, हम तरबूज के साथ सूची में जामुन को बदलना चाहते हैं ।summerFruits

const summerFruits = [
{id:1,name:'apple'}, 
{id:2, name:'orange'}, 
{id:3, name: 'berries'}];

const fruit = {id:3, name: 'watermelon'};

दो तरीके आप यह कर सकते हैं।

पहले दृष्टिकोण:

//create a copy of summer fruits.
const summerFruitsCopy = [...summerFruits];

//find index of item to be replaced
const targetIndex = summerFruits.findIndex(f=>f.id===3); 

//replace the object with a new one.
summerFruitsCopy[targetIndex] = fruit;

दूसरा तरीका: उपयोग करना map, और spread:

const summerFruitsCopy = summerFruits.map(fruitItem => 
fruitItem .id === fruit.id ? 
    {...summerFruits, ...fruit} : fruitItem );

summerFruitsCopy सूची अब अद्यतन वस्तु के साथ एक सरणी लौटाएगी।


पहला तरीका सबसे अच्छा है। किसी अन्य संस्करण में जाने और फिर वापस जाने की आवश्यकता नहीं है। मक्खी विधि पर। मैंने आपके समाधान के लिए मतदान किया।
थानिस

4

// using higher-order functions to avoiding mutation
var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

// using higher-order functions to avoiding mutation
index = projects.findIndex(x => x.value === 'jquery-ui');
[... projects.slice(0,index), {'x': 'xxxx'}, ...projects.slice(index + 1, projects.length)];


...परियोजनाओं से पहले यह आवश्यक हैं?
lazzy_ms

@lazzy_ms को ...प्रसार ऑपरेटर के रूप में जाना जाता है। google it :)
rmcsharry

4

यह एक और उत्तर है find। यह इस तथ्य पर निर्भर करता है कि find:

  • सरणी में हर वस्तु के माध्यम से iterates UNTIL में एक मैच पाया जाता है
  • प्रत्येक वस्तु आपको प्रदान की जाती है और वह MODIFIABLE है

यहाँ महत्वपूर्ण जावास्क्रिप्ट स्निपेट है:

projects.find( function (p) {
    if (p.value !== 'jquery-ui') return false;
    p.desc = 'your value';
    return true;
} );

यहाँ एक ही जावास्क्रिप्ट का एक वैकल्पिक संस्करण है:

projects.find( function (p) {
    if (p.value === 'jquery-ui') {
        p.desc = 'your value';
        return true;
    }
    return false;
} );

यहाँ एक और भी छोटा है (और कुछ और बुरे संस्करण):

projects.find( p => p.value === 'jquery-ui' && ( p.desc = 'your value', true ) );

यहाँ एक पूर्ण कार्य संस्करण है:

  var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

projects.find( p => p.value === 'jquery-ui' && ( p.desc = 'your value', true ) );

console.log( JSON.stringify( projects, undefined, 2 ) );


3

आप मानचित्र समारोह का उपयोग कर सकते हैं -

const answers = this.state.answers.map(answer => {
  if(answer.id === id) return { id: id, value: e.target.value }
  return answer
})

this.setState({ answers: answers })


0

हम जावास्क्रिप्ट का उपयोग करके सरणी के ऑब्जेक्ट को संशोधित करने के लिए ऐरे के मानचित्र फ़ंक्शन का उपयोग भी कर सकते हैं।

function changeDesc(value, desc){
   projects.map((project) => project.value == value ? project.desc = desc : null)
}

changeDesc('jquery', 'new description')

यह वापस आएगा [अद्यतन मूल्य के साथ अशक्त, अशक्त]
फर्नांडो

0

पहले सूचकांक खोजें:

function getIndex(array, key, value) {
        var found = false;
        var i = 0;
        while (i<array.length && !found) {
          if (array[i][key]==value) {
            found = true;
            return i;
          }
          i++;
        }
      }

फिर:

console.log(getIndex($scope.rides, "_id", id));

फिर इस इंडेक्स के साथ आप क्या चाहते हैं, जैसे:

$ गुंजाइश [रिटर्नइंडेक्स] .someKey = "someValue";

नोट: कृपया इसके लिए उपयोग न करें, क्योंकि सभी सरणी दस्तावेज़ों की जांच करेंगे, एक स्टॉपर के साथ उपयोग करें, इसलिए यह मिलते ही बंद हो जाएगा, इस प्रकार तेज़ कोड।


0

यहाँ मैं कोणीय js का उपयोग कर रहा हूँ। जावास्क्रिप्ट में आप खोजने के लिए लूप का उपयोग कर सकते हैं।

    if($scope.bechval>0 &&$scope.bechval!=undefined)
    {

                angular.forEach($scope.model.benhmarkghamlest, function (val, key) {
                $scope.model.benhmarkghamlest[key].bechval = $scope.bechval;

            });
    }
    else {
        alert("Please sepecify Bechmark value");
    }

-1

मैचों के उपयोग के साथ कई आइटम अपडेट करने के लिए:

_.chain(projects).map(item => {
      item.desc = item.value === "jquery-ui" ? "new desc" : item.desc;
      return item;
    })

-1

यह समस्या के लिए मेरी प्रतिक्रिया है। मेरा अंडरस्कोर संस्करण 1.7 था इसलिए मैं उपयोग नहीं कर सका .findIndex

इसलिए मैंने मैन्युअल रूप से आइटम का सूचकांक प्राप्त किया और इसे प्रतिस्थापित किया। यहाँ उसी के लिए कोड है।

 var students = [ 
{id:1,fName:"Ajay", lName:"Singh", age:20, sex:"M" },
{id:2,fName:"Raj", lName:"Sharma", age:21, sex:"M" },
{id:3,fName:"Amar", lName:"Verma", age:22, sex:"M" },
{id:4,fName:"Shiv", lName:"Singh", age:22, sex:"M" }
               ]

नीचे की विधि छात्र id:4को ऑब्जेक्ट में अधिक विशेषताओं के साथ बदल देगी

function updateStudent(id) {
 var indexOfRequiredStudent = -1;
    _.each(students,function(student,index) {                    
      if(student.id === id) {                        
           indexOfRequiredStudent = index; return;      
      }});
 students[indexOfRequiredStudent] = _.extend(students[indexOfRequiredStudent],{class:"First Year",branch:"CSE"});           

}

अंडरस्कोर 1.8 के साथ यह सरल हो जाएगा क्योंकि हमारे पास तरीके हैं _.findIndexOf


-1

आप मान को अद्यतन करना चाहते हैं array[2] = "data"

    for(i=0;i<array.length;i++){
      if(i == 2){
         array[i] = "data";
        }
    }

यह एक जवाब है या एक सवाल है?
tabdiukov

2
आपने उस सरणी में 2 आइटम को सफलतापूर्वक सबसे जटिल तरीके से अपडेट किया है।
BlueWater86

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.