Javascript ES6/ES5在数组中查找并更改

use*_*353 99 javascript arrays ecmascript-6 lodash

我有一个对象数组.我想通过某个字段找到,然后改变它:

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

var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Run Code Online (Sandbox Code Playgroud)

我希望它能改变原始对象.怎么样?(我不在乎它是否也会在lodash)

Cod*_*gue 189

您可以使用findIndex在对象的数组中查找索引并根据需要替换它:

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

var foundIndex = items.findIndex(x => x.id == item.id);
items[foundIndex] = item;
Run Code Online (Sandbox Code Playgroud)

这假设是唯一的ID.如果您的ID重复(如您的示例中所示),则使用forEach可能会更好:

items.forEach((element, index) => {
    if(element.id === item.id) {
        items[index] = item;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @georg虽然会返回一个新数组. (15认同)
  • =>函数在IE11中不起作用.最近被这个咬了. (2认同)
  • 可能使用“let”关键字而不是“var”会更好 (2认同)
  • 我更喜欢 @CodingIntrigue 使用的更详细的方法,而不是使用 @georg 使用的单行 `map`。需要更少的心理体操来弄清楚发生了什么。值得额外的代码行。 (2认同)

Sol*_*tos 35

我最好的方法是:

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

items[items.findIndex(el => el.id === item.id)] = item;
Run Code Online (Sandbox Code Playgroud)

findIndex的参考

如果你不想用新对象替换,而是复制字段item,你可以使用Object.assign:

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

作为替代方案.map():

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

  • 如果原始问题是英文的,请链接到英文页面。此外,此示例假定始终可以找到对象。 (3认同)
  • 您总是可以将它包装在 try catch 表达式中,然后……对吗? (2认同)
  • 并且对于帖子的问题完全是字面意思,他想编辑数组中的一个元素。他不想知道它是否存在,所以我们假设他以前已经这样做了。 (2认同)

ton*_*ral 23

使用扩展运算符的单行。

 const updatedData = originalData.map(x => (x.id === id ? { ...x, updatedField: 1 } : x));
Run Code Online (Sandbox Code Playgroud)

  • “问题”是,如果假设 id 是以随机方式创建的,那么最终会得到具有相同 id 的对象 (2认同)

Fel*_*ger 21

给定一个改变的对象和一个数组:

const item = {...}
let items = [{id:2}, {id:3}, {id:4}];
Run Code Online (Sandbox Code Playgroud)

通过迭代数组,用新对象更新数组:

items = items.map(x => (x.id === item.id) ? item : x)
Run Code Online (Sandbox Code Playgroud)


Too*_*doo 12

另一种方法是使用拼接.

如果你正在使用反应式框架,它将更新"视图",你的阵列"知道"你已经更新了他.

答案:

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

let foundIndex = items.findIndex(element => element.id === item.id)
items.splice(foundIndex, 1, item)
Run Code Online (Sandbox Code Playgroud)

如果您只想更改项目的值,可以使用find函数:

// Retrieve item and assign ref to updatedItem
let updatedItem = items.find((element) => { return element.id === item.id })

// Modify object property
updatedItem.aProp = ds.aProp
Run Code Online (Sandbox Code Playgroud)


kat*_*pak 6

可以使用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);
Run Code Online (Sandbox Code Playgroud)

数组 [对象 { id: 0 }, 对象 { id: 12345 }, 对象 { id: 2 }]