[英]Deleting objects in an array by index using another array
我有一个对象数组:
{ key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" }
我也有一个标准数组:
[1, 3, 5]
我将如何使用第二个数组中的值删除第一个数组中的对象,因此我将得出以下结论:
{key2:“ value2”,key4:“ value4”}
谢谢!
事实证明,这是一个不平凡的答案,因为键在您的对象中没有一致的约定。
与常规的Javascript数组不同,第一个没有索引( key
),其余有从1开始的索引( key2
, key3
, key4
...)。
解决此问题的最佳方法是使用ES5 Object.keys
方法,并记住我们需要减去1来说明基于1的索引。
Object.keys
返回所有键(作为作为第一个参数传递的值的数组)。
var obj = { hello: 0, world: 1 };
Object.keys(obj); // ['hello', 'world']
我们可以将此键列表与您提供的用于删除键的索引一起使用。
var deletion = [1, 3, 5];
var object = { key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" };
var keys = Object.keys(object);
object[keys[1]] // key2
object[keys[3]] // key4
object[keys[5]] // undefined
差不多了,但是我们还没有更正索引。 1实际上应该与数组的第一个元素有关,但是Javascript使用0代替。
object[keys[1 - 1]] // key
object[keys[3 - 1]] // key3
object[keys[5 - 1]] // key5
最后,由于Javascript 支持反射,因此我们可以使用这些键实时地修改对象。
就像您要从对象中删除它们一样,我们需要delete
运算符。
删除运算符从对象中删除属性。
放在一起,您将获得:
var object = { key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" };
var deletion = [1, 3, 5];
var keys = Object.keys(object);
deletion.forEach(function(index) {
delete object[keys[index - 1]];
});
编辑:但是,正如@adeneo在评论中指出的那样
Object.keys中没有任何顺序的保证,它可以按其想要的任何顺序返回键,这是“实现相关的”。 但是,所有浏览器通常都会按顺序返回键,但这不应该依赖
这意味着您可能最终会完全删除错误的密钥 ,这最终可能是灾难性的错误。
可以用不太健壮的方式来规避此行为。
var object = { key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" };
var deletion = [1, 3, 5];
function indexToKey(index) {
return 'key' + (index > 1 ? index : '');
}
deletion.forEach(function(index) {
delete object[indexToKey(index)];
});
此实现的健壮性较低,因为它固有地将实现与您的键命名结构联系在一起。
一种简单的方法:
var obj = { key: "value", key2: "value2", key3: "value3", key4: "value4", key5: "value5" }; var indices = [1,3,5]; var result = removeKeys(indices, obj); alert(JSON.stringify(result, null, 4));
<script> function removeKeys(indices, obj) { var index = createKeyIndex(indices); return removeIndex(index, obj); } function removeIndex(index, obj) { var keys = Object.keys(obj); var length = keys.length; var result = {}; var i = 0; while (i < length) { var key = keys[i++]; if (!index.hasOwnProperty(key)) result[key] = obj[key]; } return result; } function createKeyIndex(indices) { var length = indices.length; var index = {}; var i = 0; while (i < length) { var n = indices[i++]; var key = "key" + (n === 1 ? "" : n); index[key] = true; } return index; } </script>
createKeyIndex
函数返回键数组的索引对象。 它允许您测试输入数组在O(1)
时间内是否具有给定键。 对于长度为n
的数组,创建索引需要O(n)
时间。
例如, createKeyIndex([1,3,5])
结果为{ key:true, key3:true, key5:true }
。
removeKeys
函数创建给定索引数组的索引对象,然后仅添加不在给定索引数组中的那些键。 对于长度为m
的对象,需要O(n) + O(m)
时间来删除不需要的键。 O(n)
时间用于创建索引对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.