如何根据键值更新javascript数组中的行?

19 javascript underscore.js

我有一个这样的数据数组:

var nameInfo  = [{name: "Moroni", age: 50},
                 {name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},
                 {name: "Nephi", age: 29},
                 {name: "Enos", age: 34}];
Run Code Online (Sandbox Code Playgroud)

如果我有这样的对象:

var nameInfo  = {name: "Moroni", age: 51};
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以更新变量nameInfo.这些之间的关键是名称列.我知道有一种方法可以通过搜索行,删除和添加来实现这一点,但我想有办法在更新行的地方执行此操作.请注意,如果它有帮助我确实加载了underscore.js.

Ric*_*ton 26

最简单的方法是循环查找具有匹配名称的那个然后更新年龄:

var newNameInfo  = {name: "Moroni", age: 51};
var name = newNameInfo.name;

for (var i = 0, l = nameInfo.length; i < l; i++) {
    if (nameInfo[i].name === name) {
        nameInfo[i].age = newNameInfo.age;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

JSFiddle示例

使用下划线,您可以使用_.find方法执行以下操作而不是for循环:

var match = _.find(nameInfo, function(item) { return item.name === name })
if (match) {
    match.age = newNameInfo.age;
}
Run Code Online (Sandbox Code Playgroud)

JSFiddle示例

  • @Achyut变量匹配是对原始数组中相关项的引用,而不是副本.因此对此的更新也是对原始项目的更新. (5认同)

Nar*_*uto 11

编辑: 您可以使用ES6 过滤器结合箭头功能

nameInfo.filter(x => {return x.name === nametofind })[0].age = newage
Run Code Online (Sandbox Code Playgroud)

你可以使用 _.where功能

var match = _.where(nameInfo , {name  :nametofind });
Run Code Online (Sandbox Code Playgroud)

然后更新比赛

match[0].age = newage
Run Code Online (Sandbox Code Playgroud)


小智 6

var nameInfo  = [{name: "Moroni", age: 50},{name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},{name: "Nephi", age: 29},
                 {name: "Enos", age: 34}
                ];
_.map(nameInfo, function(obj){
  if(obj.name=='Moroni') {
    obj.age=51; // Or replace the whole obj
  }
});
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.它整洁可靠,带有下划线

  • 你不需要在转换函数中返回`obj`吗?否则你将获得一组未定义的元素. (2认同)