繁体   English   中英

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

[英]remove index and object values from javascript array

我了解可以通过执行以下操作在JavaScript中执行普通数组操作:

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);
}

但是,如果我有一个包含对象的数组,我可以推送新项目,但是如何删除它呢?:

var array = ["a", Object{ qty="1" }, 
             "b", Object{ qty="1" }, 
             "c", Object{ qty="2" } ];

var id = $(this).attr("id");
var qty = $('#item_'+id).val();
var index = $.inArray(id, array);
if(index === -1){
    array.push(id, {'qty' : qty});
}else{
    array.splice(index, 1);
}

假设"a""b"等仅出现一次,则可能根本不需要数组,而是需要某种“ map”或“ dictionary”。 在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参考 ),所以:

创建:

var map = new Map();
map.set("a", {qty: 1});
map.set("b", {qty: 1});
map.set("c", {qty: 2});

或传入一个数组数组,其中内部数组有两个条目:名称和值:

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. 有一个“弱”变种 ,它仅弱引用其键,这意味着您可以使用即使在地图中也可能会收集垃圾的键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM