Javascript Underline.js:替换集合中的项

Javascript Underline.js:替换集合中的项,javascript,arrays,collections,underscore.js,Javascript,Arrays,Collections,Underscore.js,我已经使用下划线.js一周了,我真的很喜欢它。 但是,现在我想用另一个元素替换集合中的单个元素(vm.lists)。 我试着做了以下几点: _.each(vm.lists, function (el) { if (el.id == list.id) el = list; }); 以及: 但它们都不会更改集合中的实际项目。如何正确执行此操作?此处不需要下划线: for (var i = 0, l = vm.lists.length; i < l; i++) {

我已经使用下划线.js一周了,我真的很喜欢它。 但是,现在我想用另一个元素替换集合中的单个元素(vm.lists)。 我试着做了以下几点:

_.each(vm.lists, function (el) {
    if (el.id == list.id)
        el = list;
});
以及:


但它们都不会更改集合中的实际项目。如何正确执行此操作?

此处不需要下划线:

for (var i = 0, l = vm.lists.length; i < l; i++)
{
  var el = vm.lists[i];
  if (el.id == list.id) {
    vm.lists[i] = list;
    break; // stop the for loop
  }
}
for(var i=0,l=vm.lists.length;i
你已经非常接近了。问题是您只替换指向该值的局部变量(
el
l
),而这不会修改初始列表。一个简单的例子:

var list = [1, 2, 3];
var v = list[1];
v = 7; // v will now point to a new value, but list will stay intact [1, 2, 3]
与对象相同:

var olist = [{id: 1, v: 2}, {id: 4, v: 6}];
var obj = olist[0];
obj = {id: 8, v: 10}; // changes what obj points to, but does not affect olist[0]

var obj2 = olist[0];
obj2.v = 777; // olist[0] still points to the same object but the object is modified

olist[0] = {id: 8, v: 10}; // changes what olist[0] points to
所以基本上你有两个选择:

a) 更改
vm。列出[index]
,使其指向新对象。您需要获取列表中对象的索引,并执行
vm.lists[index]=newObject。注意,一些下划线谓词还为您提供了索引
\ each(list,function(el,index){})

b) 更改
vm.lists[index]
指向的对象,但需要手动复制字段。例如,如果对象表示为
{id:id,value:[1,2,3],另一个字段:data}
,则可以复制以下字段:

//el.id = list.id; // don't need this as you were searching by id
el.values = list.values;
el.anotherField = list.anotherField;
海事组织的第一个选择是更清洁

//el.id = list.id; // don't need this as you were searching by id
el.values = list.values;
el.anotherField = list.anotherField;