【问题标题】:javascript filter by valuesjavascript按值过滤
【发布时间】:2017-04-25 20:35:29
【问题描述】:

给定下面列出的形式对象,获取包含特定值的键的最佳方法是什么?例如在下面的结构中,如果我们想要所有具有 property1 的对象,我们应该得到 object1 和 object2 作为答案。 还是可以将其存储在特定类型的数据结构中以便快速检索? 以一种方法循环所有对象的值。我正在寻找比这更快的东西。将不胜感激的建议。

{
      object1: [property1, property2, property3],
      object2: [property1],
      object3: [property2]
}

【问题讨论】:

  • 循环遍历所有属性并使用 indexOf 检查值是否包含在数组中很简单。如果是这样,将键推入结果数组。你可以自己做,至少试试吧。
  • 这种情况下的时间复杂度是对象数 + 键数。有什么更好的方法吗?

标签: javascript json data-structures


【解决方案1】:

如果你想要一个更快的数据结构来达到这个目的,那么你可以把你的对象变成一个 ES6 映射,像这样:

// Sample object:
var obj = {
    key1: [1, 2, 3],
    key2: [1],
    key3: [2]
};

// Turn into map keyed by values
var m = Object.keys(obj).reduce( (m, key) => 
    obj[key].reduce( (m, v) => m.set(v, (m.get(v) || []).concat(key)), m ),
    new Map
);

// Example use of the map:
console.log('1 occurs in: ', m.get(1));

【讨论】:

    【解决方案2】:

    试试这样的

    x = {
          object1: ['property1', 'property2', 'property3'],
          object2: ['property1'],
          object3: ['property2']
    }
    
    z = Object.keys(x).filter(function(y)  {
      return x[y].indexOf('property1') !== -1
    })
    console.log(z)

    这只是循环,过滤对象中的每个键,然后对值数组进行相等性检查。有点

    【讨论】:

      【解决方案3】:
      var l = [];
      var dict = {...}
      for (var key in dict) {
         var obj = dict[key];
         if (obj.indexOf("property1") != -1) {
             l.push(obj);
         }
      }
      
      l // Here is the result
      

      【讨论】:

        【解决方案4】:

        只需在Object.keys(data) 上使用filter() 函数并检查每个对象是否包含该值。如果你想要的话,你也可以map() 值本身的键。

        const data = {
          a: [1,2,3],
          b: [1],
          c: [2]
        };
        
        const searchValue = 1;
        
        const keysWithValue = Object.keys(data).filter(key => data[key].includes(searchValue));
        
        const objectsWithValue = keysWithValue.map(key => data[key]);
        
        console.log(keysWithValue, objectsWithValue);

        【讨论】:

          【解决方案5】:

          遍历你的数组并每次使用这个进行测试:

          if(Obj.hasOwnProperty("<property name>")){
          array.push(obj);
          }
          return array;
          

          【讨论】:

            【解决方案6】:

            检查此代码,我认为它会对您有所帮助:

            const list = {
                  object1: ['a', 'b', 'c'],
                  object2: ['a'],
                  object3: ['c']
            }
            
            function getData(list, value){
              return Object.keys(list).filter( item => list[item].indexOf(value) !== -1)
            }
            
            getData(list, 'a');

            【讨论】:

              猜你喜欢
              • 2021-11-25
              • 2021-08-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-27
              • 2011-04-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多