我明白在javascript中执行普通数组可以通过这样做来推送和删除:
Template.instance().places.get()
但是如果我有一个带有对象的数组,我可以推送新项目,但是如何删除它?:
var array = ["a", "b", "c"];
var id = $(this).attr("id");
var index = $.inArray(id, array);
if(index === -1){
array.push(id);
}else{
array.splice(index, 1);
}
答案 0 :(得分:1)
假设"a"
,"b"
等只能出现一次,您可能根本不需要数组,而是某种“地图”或“字典”。在ES5和更早版本中,通常将对象用作映射;在ES2015(又名ES6)和更改中,Map
可能是新的方法。
由于ES2015是如此新颖,以下是ES5及早期的方法:
var map = {
"a": {qty: 1},
"b": {qty: 1},
"c": {qty: 2}
];
每个属性a
,b
和c
都会映射到具有属性qty
的对象。 (据推测,qty
并不是这些对象所具有的唯一属性;如果是,则直接使用该值而不是将其包装在对象中可能更有意义。)
要添加到此,您只需使用新属性的名称进行赋值(而不是push
),使用点表示法和文字(不太可能,在您的场景中我认为)或括号表示法和字符串(更有可能):
var name = "d";
map[name] = {qty: 1};
要删除,请使用delete
关键字而不是splice
:
delete map[name];
访问也是通过map[name]
:
var name = "c";
var entry = map[name];
console.log(entry.qty); // 2
我上面提到了ES2015的Map
(MDN reference),所以:
创建:
var map = new Map();
map.set("a", {qty: 1});
map.set("b", {qty: 1});
map.set("c", {qty: 2});
或传入一个数组数组,其中内部数组有两个条目:Name和value:
var map = new Map([
["a", {qty: 1}],
["b", {qty: 1}],
["c", {qty: 2}]
]);
您已经在上面看到了如何添加/更新条目:
var name = "d";
map.set(name, {qty: 1});
卸下:
var name = "b";
map.delete(name, {qty: 1});
获得参赛作品:
var name = "c";
var entry = map.get(name);
console.log(entry.qty); // 2
Map
的一些优势:
密钥可以是任何东西,而不仅仅是字符串。
您不必担心与原型中的属性名称发生冲突,例如toString
。
有一个"weak" variety仅弱引用其键,这意味着您可以使用可能会收集垃圾的密钥,即使它们位于地图中。