使用另一个数组通过索引删除数组中的对象

时间:2015-01-25 17:15:22

标签: javascript arrays

我有一个对象数组:

{ key : "value", key2 : "value2", key3 : "value3", key4 : "value4", key5 : "value5" }

我也有一个标准数组:

[1, 3, 5]

如何使用第二个数组中的值删除第一个数组中的对象,以便最终得到:

{key2:" value2",key4:" value4" }

谢谢!

2 个答案:

答案 0 :(得分:0)

这证明是一个非平凡的答案,因为密钥在您的对象中没有一致的约定。

第一个没有索引(key),其余的都有基于1的索引(key2key3key4 ...),与常规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;
&#13;
&#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)时间用于创建索引对象。