[英]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}
];
每个属性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参考 ),所以:
创建:
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
一些优点:
键可以是任何东西,而不仅仅是字符串。
您不必担心会与原型中的属性名称(例如toString
发生冲突。
有一个“弱”变种 ,它仅弱引用其键,这意味着您可以使用即使在地图中也可能会收集垃圾的键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.