【问题标题】:How can I filter by all the properties in an array of objects? [duplicate]如何按对象数组中的所有属性进行过滤? [复制]
【发布时间】:2017-10-07 08:24:36
【问题描述】:

假设我有一个这样的数组:

  const people = [
    {
       "name":"pete22",
       "age":56
    },
    {
       "name":"sonya56",
       "age":22
    }
    ]

我可以像这样按名称过滤 lodash:

let result = people.filter(person =>_.includes(person.name,'56')
//{'name':'sonya56'}

如果我想返回任何属性中所有带有“56”的人怎么办?所以在上面的例子中它会返回两个人?我正在寻找一个紧凑的解决方案,也许是 lodash?

【问题讨论】:

标签: javascript lodash


【解决方案1】:

您不需要 Lodash 来执行此操作,因为 JavaScript 本身就支持执行此类操作。 您需要做的是过滤人员,同时过滤条目中的每个值,例如:

const people = [{
  "name": "pete22",
  "age": 56
}, {
  "name": "sonya56",
  "age": 22
}]

// Filter your 'people' JSON
const filteredPeople = people.filter(person => {
  // Filter each 'value' (property) inside each entry in 'people'
  return Object.values(person).filter(value => { 
    // Turn a value into a string and check if it includes the value '56'
    return value.toString().includes('56')
  })
})

console.log(filteredPeople)

【讨论】:

    【解决方案2】:

    您可以将Array#filterObject.values 一起使用,Array#map 与字符串一起使用,并与Array#someArray#includes 一起使用。

    const
        people = [{ name: "pete22", age: 56 }, { name: "sonya56", age: 22 }],
        filteredPeople = people.filter(person => Object
            .values(person)
            .map(String)
            .some(v => v.includes('56'))
        )
    
    console.log(filteredPeople);

    【讨论】:

    • 只返回 1 个项目而不是 2 个
    • @bierhier, danke für den hinweis.
    • 不错的紧凑型
    【解决方案3】:

    如果我想返回任何属性中所有带有“56”的人怎么办?

    您需要一个包含您要过滤输入数组的所有此类属性的数组。

    var prop = [ "age", "size" ];
    

    现在只需循环应用过滤器

    var valueToMatch = "56";
    result = people;
    prop.forEach( function( key ){
        if ( result.length ) { return true; } //if the result is already empty
        result = result.filter( function( peopleObj ){
           peopleObj[ key ] ==  valueToMatch;
        });
    });
    

    result 是使用prop 数组中给定的所有属性过滤的输出数组。

    【讨论】:

      【解决方案4】:

      停止对所有事情都使用 lodash。

      JavaScript:

      let filtered = people.filter((e) => e.name === ‘foo’ && e.age === 23);
      

      请记住 && 强制两个条件和 ||说只有其中一个必须是真的。

      【讨论】:

      • 这并没有检查所有的属性。
      【解决方案5】:

      任意个属性的扩展解决方案:

      var people = [
          { "name":"pete22", "age":56 }, {"name":"sonya56", "age":22 },
          { "name":"john33", "age":33 }, {name: "mike", "login":"56mike", "code": 10 }
      ],
      result = people.filter(function(o){
         return Object.keys(o).some(function(k){ return String(o[k]).indexOf("56") !== -1; });
      });
      	
      console.log(result);

      【讨论】:

        【解决方案6】:

        我们可以用 Object 的值再次过滤

        people.filter( hm=>Object.values(hm).filter( vl=>(vl+'').indexOf(56)>-1).length>0)

        【讨论】:

          猜你喜欢
          • 2016-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 1970-01-01
          • 2019-05-04
          相关资源
          最近更新 更多