从javascript数组中删除索引和对象值

时间:2015-11-16 16:06:19

标签: javascript arrays

我明白在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);
}

1 个答案:

答案 0 :(得分:1)

假设"a""b"等只能出现一次,您可能根本不需要数组,而是某种“地图”或“字典”。在ES5和更早版本中,通常将对象用作映射;在ES2015(又名ES6)和更改中,Map可能是新的方法。

由于ES2015是如此新颖,以下是ES5及早期的方法:

var map = {
    "a": {qty: 1},
    "b": {qty: 1},
    "c": {qty: 2}
];

每个属性abc都会映射到具有属性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的MapMDN 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的一些优势:

  1. 密钥可以是任何东西,而不仅仅是字符串。

  2. 您不必担心与原型中的属性名称发生冲突,例如toString

  3. 有一个"weak" variety仅弱引用其键,这意味着您可以使用可能会收集垃圾的密钥,即使它们位于地图中。