Javascript ES6/ES5 find in array and change

前端 未结 8 1288
后悔当初
后悔当初 2020-12-12 10:52

I have an array of objects. I want to find by some field, and then to change it:

var item = {...}
var items = [{id:2}, {id:2}, {id:2}];

var foundItem = item         


        
相关标签:
8条回答
  • 2020-12-12 10:54

    One-liner using spread operator.

     const updatedData = originalData.map(x => (x.id === id ? { ...x, updatedField: 1 } : x));
    
    0 讨论(0)
  • 2020-12-12 10:54

    worked for me

    let returnPayments = [ ...this.payments ];
    
    returnPayments[this.payments.findIndex(x => x.id == this.payment.id)] = this.payment;
    
    0 讨论(0)
  • 2020-12-12 10:59

    An other approach is to use splice.

    The splice() method changes the contents of an array by removing or replacing existing elements and/or adding new elements in place.

    N.B : In case you're working with reactive frameworks, it will update the "view", your array "knowing" you've updated it.

    Answer :

    var item = {...}
    var items = [{id:2}, {id:2}, {id:2}];
    
    let foundIndex = items.findIndex(element => element.id === item.id)
    items.splice(foundIndex, 1, item)
    

    And in case you want to only change a value of an item, you can use find function :

    // Retrieve item and assign ref to updatedItem
    let updatedItem = items.find((element) => { return element.id === item.id })
    
    // Modify object property
    updatedItem.aProp = ds.aProp
    
    0 讨论(0)
  • 2020-12-12 11:03

    Whereas most of the existing answers are great, I would like to include an answer using a traditional for loop, which should also be considered here. The OP requests an answer which is ES5/ES6 compatible, and the traditional for loop applies :)

    The problem with using array functions in this scenario, is that they don't mutate objects, but in this case, mutation is a requirement. The performance gain of using a traditional for loop is just a (huge) bonus.

    const findThis = 2;
    const items = [{id:1, ...}, {id:2, ...}, {id:3, ...}];
    
    for (let i = 0, l = items.length; i < l; ++i) {
      if (items[i].id === findThis) {
        items[i].iAmChanged = true;
        break;
      }
    }
    

    Although I am a great fan of array functions, don't let them be the only tool in your toolbox. If the purpose is mutating the array, they are not the best fit.

    0 讨论(0)
  • 2020-12-12 11:05

    My best approach is:

    var item = {...}
    var items = [{id:2}, {id:2}, {id:2}];
    
    items[items.findIndex(el => el.id === item.id)] = item;
    

    Reference for findIndex

    And in case you don't want to replace with new object, but instead to copy the fields of item, you can use Object.assign:

    Object.assign(items[items.findIndex(el => el.id === item.id)], item)

    as an alternative with .map():

    Object.assign(items, items.map(el => el.id === item.id? item : el))

    Functional approach:

    Don't modify the array, use a new one, so you don't generate side effects

    const updatedItems = items.map(el => el.id === item.id ? item : el)
    
    0 讨论(0)
  • 2020-12-12 11:12

    May be use Filter.

    const list = [{id:0}, {id:1}, {id:2}];
    let listCopy = [...list];
    let filteredDataSource = listCopy.filter((item) => {
           if (item.id === 1) {
               item.id = 12345;
            }
    
            return item;
        });
    console.log(filteredDataSource);
    

    Array [Object { id: 0 }, Object { id: 12345 }, Object { id: 2 }]

    0 讨论(0)
提交回复
热议问题