使用键数组

时间:2017-06-13 00:47:00

标签: javascript arrays object iteration

基本上,我有一个如下所示的JavaScript数组:

var keyFilters = ["key_1", "key_2", "key_3"];

我有一个看起来像这样的对象:

myObject["key_1"] = "Value 1";
myObject["key_2"] = "Value 2";
myObject["key_random"] = "Value 2";

我需要将myObject对象配对,才能拥有keyFilters数组中存在的密钥。有时,对象不会有过滤器中存在的密钥。在此示例中,针对myObject过滤keyFilters将导致此输出对象:

myObject = {
    "key_1": "Value 1",
    "key_2": "Value 2",
}

我知道JS中的对象没有map函数,但是有一个用于数组。最好是使用它还是只编写一个单一的函数来迭代数组然后遍历对象,并推送到只有匹配键的新对象,或者是否有一些更流畅的方式?

5 个答案:

答案 0 :(得分:3)

for (i in myObject) if (keyFilters.indexOf(i) < 0) delete myObject[i];

答案 1 :(得分:0)

Underscore.js有很好的实现。 https://github.com/jashkenas/underscore/blob/master/underscore.js#L1108

  // Return a copy of the object only containing the whitelisted properties.
  _.pick = restArgs(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (_.isFunction(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = _.allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

答案 2 :(得分:0)

  

我知道JS中的对象没有map函数,但是有一个用于数组。最好是使用它还是只编写一个单一的函数来迭代数组然后遍历对象,并推送到只有匹配键的新对象,或者是否有一些更流畅的方式?

是的,但您可以映射Object的{​​{1}}:

keys

我希望这适合你!

答案 3 :(得分:0)

如果要根据数据返回新对象,请使用:

let keyFilters = ["key_1", "key_2", "key_3"];
let myObject = {};
myObject["key_1"] = "Value 1";
myObject["key_2"] = "Value 2";
myObject["key_random"] = "Value 2";

let newObject = Object.keys(myObject)
.filter((key) => keyFilters.includes(key))
.map((key) => {
  return {[key]: myObject[key]}
})
.reduce((a, b) => Object.assign({}, a,b));

有:

1)仅过滤包含的键(作为数组)

2)通过它们进行映射并创建键值对的新对象(作为数组)

3)将映射的数组减少为单个对象

答案 4 :(得分:0)

迭代Object的键,然后使用includes方法查找数组中的键,如果它不存在,则删除它。

var safe_keys = ["key_1", "key_2", "key_3"],
  obj = {
    'key_1': 'Value 1',
    'key_2': 'Value 2',
    'key_random': 'Value 2'
  };

for (let key of Object.keys(obj))
  !safe_keys.includes(key) && delete obj[key];

console.log(obj);