下划线.js:替换集合中的项目
Underscore.js: Replace item in collection
我已经使用下划线.js一个星期了,我真的很喜欢它。但是,现在我想用另一个元素替换集合 (vm.lists) 中的单个元素。我尝试执行以下操作:
_.each(vm.lists, function (el) {
if (el.id == list.id)
el = list;
});
和:
var l = _.findWhere(vm.lists, { id: list.id });
l = list;
但它们都不会改变集合中的实际项目。我该如何正确执行此操作?
你离得很近。问题是你只是替换指向该值的局部变量(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.lists[index]
,使其指向新对象。您需要获取列表中对象的索引并执行vm.lists[index] = newObject;
。请注意,某些下划线谓词还为您提供索引_.each(list, function (el, index) {});
。
b) 更改vm.lists[index]
指向的对象,但您需要手动复制字段。例如,如果对象表示为 {id: id, values: [1, 2, 3], anotherField: data}
,则可以复制以下字段:
//el.id = list.id; // don't need this as you were searching by id
el.values = list.values;
el.anotherField = list.anotherField;
IMO的第一个选择会更干净。
这里不需要下划线:
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
}
}
相关文章:
- 如何使用 javascript 从 Web 服务重新加载项目集合
- backbone.js可以't传递集合中的模型项's查看项目's视图
- 无法在骨干项目中杀死僵尸集合
- 查找所选项目是否在集合中
- 我的 Meteor 项目如何通过服务器端 MongoDB/集合查找查询可靠地显示信息
- 如何在列表和项目视图中呈现骨干集合
- 从集合中删除项目时,将其从视图中删除
- 如何从集合中随机选择项目
- 将项目发布到叶节点时,没有通知传播到集合节点
- 快速搜索集合中的项目
- 为什么预期的路线不使用帆.js蓝图 API 将项目添加到模型集合
- 主干集合无法删除项目
- 主干.js:从集合中删除项目
- 循环(将项目存储在集合中)似乎迭代的次数比它应该的次数少
- 下划线.js:替换集合中的项目
- 在同一集合中添加两个项目
- Stamplay JS SDK-根据当前用户返回集合中的项目
- 如何根据Marionette.CompositeView中的集合更改项目视图容器值
- 如何通过fetch获取添加到Backbone集合的项目的索引
- Javascript或Jquery存储项目集合