如何通过另一个对象数组过滤对象数组[ES6]

Dav*_*era 3 javascript arrays object ecmascript-6

我需要通过另一个对象数组过滤对象数组,而无需知道数组中的确切属性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"
}];
Run Code Online (Sandbox Code Playgroud)

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

const criterias = [{ someval1: "10" }, { someval3: "30" }, { someval4: "40" }];
Run Code Online (Sandbox Code Playgroud)

因此,只要其中的对象dataset包含criterias我想要保留的所有值。问题是我希望数据集中的所有对象都criterias被相等的对象过滤掉。

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

这是我当前的脚本

dataset.filter(item => criterias.some(criteria => Object.keys(criteria).some(prop => item[prop] != criteria[prop])));
Run Code Online (Sandbox Code Playgroud)

感谢您提前提出的所有建议。

Nin*_*olz 5

您可以获取压缩对象的条目,然后使用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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

  • 它是函数参数列表中[解构分配](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)的一部分。[`Object.entries`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)重新调整嵌套数组中的键/值对数组。要获取键和值,您可以通过迭代对象的条目来分解实体并获取项。 (2认同)