【问题标题】:Filtering Javascript object using array of keys使用键数组过滤 Javascript 对象
【发布时间】:2017-06-13 00:46:59
【问题描述】:

基本上,我的 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 数组中存在的键。有时,对象不会有过滤器中存在的键。在此示例中,针对 keyFilters 过滤 myObject 将产生以下输出对象:

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

我知道 JS 中没有用于对象的 map 函数,但有一个用于数组的函数。最好使用它还是只编写一个单独的函数来遍历数组然后遍历对象,然后推送到一个只有匹配键的新对象,还是有一些更巧妙的方法?

【问题讨论】:

  • 您对创建新对象的函数的建议很好(并且可能是最好的方法)。
  • 谢谢。这可能是一种被误导的想法,但我想尽我所能减少我继承的这个过于复杂的前端 JS 应用程序的内存使用,包括在我可以配对已经实例化的对象时不引入新对象。跨度>
  • 这能回答你的问题吗? Filter object properties by key in ES6

标签: javascript arrays object iteration


【解决方案1】:
for (i in myObject) if (keyFilters.indexOf(i) < 0) delete myObject[i];

【讨论】:

    【解决方案2】:

    如果你想根据你的数据返回一个新对象,那么使用这个:

    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) 将映射数组缩减为单个对象

    【讨论】:

      【解决方案3】:

      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;
        });
      

      【讨论】:

        【解决方案4】:

        我知道 JS 中没有对象的映射函数,但数组有一个。最好使用它还是只编写一个单独的函数来遍历数组然后遍历对象,然后推送到一个只有匹配键的新对象,还是有一些更巧妙的方法?

        没错,但您可以映射Objectkeys

        Object.keys(myObject).map(key => {
          if (keyFilters.indexOf(key) === -1) {
            delete myObject[key];
          }
        });
        

        我希望这适合你!

        【讨论】:

        • .map 应该是 .forEach,因为您没有使用它的返回值(创建时没有使用的数组)。
        【解决方案5】:

        遍历对象的键,然后使用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);

        【讨论】:

          猜你喜欢
          • 2020-06-23
          • 2018-10-07
          • 2022-09-24
          • 1970-01-01
          • 1970-01-01
          • 2012-11-15
          • 2018-07-17
          • 1970-01-01
          相关资源
          最近更新 更多