我有一个对象数组:
{ key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" }
我也有一个标准数组:
[1, 3, 5]
如何使用第二个数组中的值删除第一个数组中的对象,以便最终得到:
{key2:" value2",key4:" value4" }
谢谢!
答案 0 :(得分:0)
这证明是一个非平凡的答案,因为密钥在您的对象中没有一致的约定。
第一个没有索引(key
),其余的都有基于1的索引(key2
,key3
,key4
...),与常规Javascript不同阵列。
解决这个问题的最佳方法是使用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 supports reflection,我们可以使用这些键实时修改对象。
如果您想要从对象中删除它们,我们需要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)];
});
此实现不太健壮,因为它固有地将实现与您的关键命名结构联系起来。
答案 1 :(得分:0)
一种简单的方法:
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>
&#13;
createKeyIndex
函数返回键数组的索引对象。它允许您在O(1)
时间内测试输入数组是否具有给定键。对于长度为n
的数组,创建索引需要O(n)
次。
例如,createKeyIndex([1,3,5])
会产生{ key:true, key3:true, key5:true }
。
removeKeys
函数创建给定indices数组的索引对象,然后仅添加不在给定indices数组中的那些键。对于长度为m
的对象,需要O(n) + O(m)
时间来删除不需要的密钥。 O(n)
时间用于创建索引对象。