通过匹配 属性 个对象来过滤对象数组数组上的数组

Filter an array on array of arrays of objects by matching a property of objects

我有一个情况,我有一个数组数组,每个内部数组都有多个对象,如下所示:

const arrayOfArraysOfObjects = [
  [
    { name: 'abv', id: '1212' },
    { name: 'gfgf', id: '887' },
    { name: 'John', id: '886' }
  ],
  [
    { name: 'abv', id: '1242' },
    { name: 'gfgf', id: '837' },
    { name: 'John', id: '816' }
  ],
  [
    { name: 'abv', id: '1242' },
    { name: 'gfgf', id: '837' },
    { name: 'John', id: '896' }
  ]
];

我想拉出包含 属性 id 与任何特定数字匹配的对象的数组,比如 896

我用 ES6 试过这个

rawList = arrayOfArraysOfObjects.filter(obj => Object.keys(obj).reduce((acc, curr) => acc || obj[curr] === my.id, false));
return rawList;

这里my.id是896

但这没有用,我的预期输出:

[
   { name: 'abv', id: '1012' },
   { name: 'gfgf', id: '881' },
   { name: 'John', id: '896' }
]

因此,尝试将其更正为:

rawList = arrayOfArraysOfObjects.map((apprGrp) => {
  const filteredList = apprGrp.filter(obj => Object.keys(obj).reduce((acc, curr) => acc || obj[curr] === my.id, false));
  return filteredList;
});

这也没有给我上面提到的期望结果。 请建议我如何更正此问题以获得所需的结果

您可以简单地使用数组过滤器和查找来按项目过滤

const arrayOfArraysOfObjects = [
  [
   { name: 'abv', id: '1212' },
   { name: 'gfgf', id: '887' },
   { name: 'John', id: '886' }
  ],
  [
   { name: 'abv', id: '1242' },
   { name: 'gfgf', id: '837' },
   { name: 'John', id: '816' }
  ],
  [
   { name: 'abv', id: '1242' },
   { name: 'gfgf', id: '837' },
   { name: 'John', id: '896' }
  ]
];

console.log(arrayOfArraysOfObjects.filter(x => x.find(y => y.id === '896')).flat());

你可以查看这个解决方案。

const data = [
  [
    { name: "abv", id: "1212" },
    { name: "gfgf", id: "887" },
    { name: "John", id: "886" },
  ],
  [
    { name: "abv", id: "1242" },
    { name: "gfgf", id: "837" },
    { name: "John", id: "816" },
  ],
  [
    { name: "abv", id: "1242" },
    { name: "gfgf", id: "837" },
    { name: "John", id: "896" },
  ],
];

const filterData = (id) => data.filter((arr) => arr.some((obj) => obj.id == id));

console.log(filterData(837));

由于您要查找具有所需 id 的单个子数组,请使用 Array.find() 而不是 Array.filter()。使用 Array.some() 检查当前子数组是否包含 id:

const data = [[{"name":"abv","id":"1212"},{"name":"gfgf","id":"887"},{"name":"John","id":"886"}],[{"name":"abv","id":"1242"},{"name":"gfgf","id":"837"},{"name":"John","id":"816"}],[{"name":"abv","id":"1242"},{"name":"gfgf","id":"837"},{"name":"John","id":"896"}]];

const findSubArray = id => data.find(arr => arr.some(o => o.id === id));

console.log(findSubArray('837'));