【问题标题】:How to filter an Array of Objects inside another Array of Objects in JavaScript (es6)? [duplicate]如何在 JavaScript(es6)中过滤另一个对象数组中的对象数组? [复制]
【发布时间】:2021-05-08 07:18:25
【问题描述】:

我需要根据另一个数组sittersSelected 过滤dogssitters inside 这个数组。 (可以用es6)。我的问题是处理 nested 数组。

不确定是否可行,但是...

数据

dogs = [
  {
    name: 'Alice',
    sex: 'Female',
    breed: 'German Shepherd',
    sitters: [
      {
        id: '123',
        name: 'Abby'
      },
      {
        id: '456',
        name: 'Manny'
      },
      {
        id: '789',
        name: 'Mel'
      },
    ]
  },
  {
    name: 'Buckley',
    sex: 'Male',
    breed: 'Border Collie',
    sitters: [
      {
        id: '321',
        name: 'Gustavo'
      },
      {
        id: '654',
        name: 'Tommy'
      },
    ]
  },
  {
    name: 'Bear',
    sex: 'Male',
    breed: 'Mixed',
    sitters: [
      {
        id: '123',
        name: 'Abby'
      },
      {
        id: '135',
        name: 'Owen'
      },
    ]
  },
];

sittersSelected = ["Abby","Manny"];

预期输出

filterResult = [
  {
    name: 'Alice',
    sex: 'Female',
    breed: 'German Shepherd',
    sitters: [
      {
        id: '123',
        name: 'Abby'
      },
      {
        id: '456',
        name: 'Manny'
      },
    ]
  },
  {
    name: 'Bear',
    sex: 'Male',
    breed: 'Mixed',
    sitters: [
      {
        id: '123',
        name: 'Abby'
      },
    ]
  },
];

我试过了

filterResult = dogs.filter(dog => dog.sitters.some(sitter => sittersSelected.includes(sitter.name)));

我设法过滤了dogs,但没有过滤sitters。还在 StackOverflow 上尝试了其他示例。有没有办法做到这一点?也许是.map()

谢谢

【问题讨论】:

  • 这两个列表的最大尺寸可能有多大?
  • @TobiahRex 挺大的,数据有更多选择……我只是用dogs 举例。

标签: javascript arrays ecmascript-6 filter


【解决方案1】:

1-使用地图返回新对象只包含过滤的保姆

2-使用过滤器返回只有狗有保姆

let dogs = [{ name: 'Alice', sex: 'Female', breed: 'German Shepherd', sitters: [{ id: '123', name: 'Abby' }, { id: '456', name: 'Manny' }, { id: '789', name: 'Mel' },] }, { name: 'Buckley', sex: 'Male', breed: 'Border Collie', sitters: [{ id: '321', name: 'Gustavo' }, { id: '654', name: 'Tommy' },] }, { name: 'Bear', sex: 'Male', breed: 'Mixed', sitters: [{ id: '123', name: 'Abby' }, { id: '135', name: 'Owen' },] },];

let sittersSelected = ["Abby", "Manny"];

dogs.map(dog => {
    return {
        ...dog,
        sitters: dog.sitters.filter(sitter => sittersSelected.includes(sitter.name))
    }
}).filter(dog => dog.sitters.length > 0);

【讨论】:

  • 成功了,非常感谢@ProSheta
【解决方案2】:

您需要 2 个步骤。

  1. 首先过滤每个sitters 子数组以仅包含选定的子数组。
  2. 通过sitters数组是否包含任何元素过滤掉父数组项:

const dogs=[{name:"Alice",sex:"Female",breed:"German Shepherd",sitters:[{id:"123",name:"Abby"},{id:"456",name:"Manny"},{id:"789",name:"Mel"}]},{name:"Buckley",sex:"Male",breed:"Border Collie",sitters:[{id:"321",name:"Gustavo"},{id:"654",name:"Tommy"}]},{name:"Bear",sex:"Male",breed:"Mixed",sitters:[{id:"123",name:"Abby"},{id:"135",name:"Owen"}]}];

const sittersSelected = ["Abby","Manny"];

for (const dog of dogs) {
  dog.sitters = dog.sitters.filter(s => sittersSelected.includes(s.name));
}
const filteredDogs = dogs.filter(
  dog => dog.sitters.length
);
console.log(filteredDogs);

如果你不想改变输入的对象数组,你可以先映射它来克隆每个dog

【讨论】:

  • 感谢@CertainPerformance,它运行良好。但正如你所建议的,我使用map() 来避免改变数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多