【问题标题】:How filter array of objects by another array of objects如何通过另一个对象数组过滤对象数组
【发布时间】:2020-01-27 17:14:38
【问题描述】:

我需要在不知道criterias 数组中的确切属性的情况下通过另一个对象数组过滤对象数组。让我们看一个例子以便更好地理解。

这是一个我需要过滤的数组

const dataset = [
{
  id: "4",
  someval1: "10",
  someval2: "20",
  someval3: "30",
  someval4: "40"
},
{
  id: "10",
  someval1: "10",
  someval2: "20",
  someval3: "30",
  someval4: "40"
},
{
  id: "22",
  someval1: "102",
  someval2: "202",
  someval3: "302",
  someval4: "40"
}];

这是一个数组,它的值应该是第一个数组的过滤条件

const criterias = [{ someval1: "10" }, { someval3: "30" }, { someval4: "40" }];

所以每当dataset 中的对象包含来自criterias 的所有值时,我都想保留他。问题是我希望数据集中的对象被所有相等的criterias 过滤。

到目前为止,我能够获得正确过滤dataset 的脚本,但只能过滤一个criteria。因此,从过滤后的给定数组中,我应该只从dataset 中获取前两个对象,第三个对象不包含所有criterias

这是我当前的脚本

const dataset = [
{
  id: "4",
  someval1: "10",
  someval2: "20",
  someval3: "30",
  someval4: "40"
},
{
  id: "10",
  someval1: "10",
  someval2: "20",
  someval3: "30",
  someval4: "40"
},
{
  id: "22",
  someval1: "102",
  someval2: "202",
  someval3: "302",
  someval4: "40"
}];

const criterias = [{ someval1: "10" }, { someval3: "30" }, { someval4: "40" }];

const filter = dataset.filter(item => criterias.some(criteria => Object.keys(criteria).some(prop => item[prop] != criteria[prop])));

console.log(filter)

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    您可以获取压缩对象的条目并使用Array#every 并使用值检查属性。

    var dataset = [{ id: "4", someval1: "10", someval2: "20", someval3: "30", someval4: "40" }, { id: "10", someval1: "10", someval2: "20", someval3: "30", someval4: "40" }, { id: "22", someval1: "102", someval2: "202", someval3: "302", someval4: "40" }],
        criterias = [{ someval1: "10" }, { someval3: "30" }, { someval4: "40" }],
        filters = Object.entries(Object.assign({}, ...criterias)),
        result = dataset.filter(o => filters.every(([k, v]) => o[k] === v));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • Nina 能否请您提供一个链接,您可以在其中阅读这个有趣的语法([k, v]) => 吗?我的意思是为什么我们使用方括号?它们是什么意思?
    • 它是函数参数列表中destructuring assignment 的一部分。 Object.entries 重新调整嵌套数组中的键/值对数组。要获取键和值,您可以解构条目并通过迭代对象的条目来获取项目。
    【解决方案2】:

    您可以使用Array.filter()Array.every()

    1. Array.filter() 将过滤匹配的对象并将其放入新数组中。
    2. Array.every() 将用于检查 criterias 数组中的每个对象是否满足 dataset 的对象。由于criterias 数组的对象中的对象键可以有任何名称,因此您可以使用Object.keys()[0] 来获取该特定键,因为您在criterias 数组的每个对象中只有一个键。

    const dataset = [{
        id: "4",
        someval1: "10",
        someval2: "20",
        someval3: "30",
        someval4: "40"
      },
      {
        id: "10",
        someval1: "10",
        someval2: "20",
        someval3: "30",
        someval4: "40"
      },
      {
        id: "22",
        someval1: "102",
        someval2: "202",
        someval3: "302",
        someval4: "40"
      }
    ];
    
    const criterias = [{
      someval1: "10"
    }, {
      someval3: "30"
    }, {
      someval4: "40"
    }];
    
    let result = dataset.filter((datasetObj) => criterias.every((criteria) => criteria[Object.keys(criteria)[0]] === datasetObj[Object.keys(criteria)[0]]));
    console.log(result);

    【讨论】:

      【解决方案3】:

      您需要使用Array.prototype.everycriterias 数组来检查和验证dataset 中项目的所有条件对象:

         var dataset = [
      {
        id: "4",
        someval1: "10",
        someval2: "20",
        someval3: "30",
        someval4: "40"
      },
      {
        id: "10",
        someval1: "10",
        someval2: "20",
        someval3: "30",
        someval4: "40"
      },
      {
        id: "22",
        someval1: "102",
        someval2: "202",
        someval3: "302",
        someval4: "40"
      }];
      
      var criterias = [{ someval1: "10" }, { someval3: "30" }, { someval4: "40" }];
      var res = dataset.filter(item => 
              criterias.every(criteria => 
                Object.keys(criteria).every(prop => 
                  item[prop] == criteria[prop])));
      console.log(res)

      【讨论】:

        猜你喜欢
        • 2019-05-05
        • 2019-07-18
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2021-05-14
        相关资源
        最近更新 更多