重构请求:尝试找到更优化的方法来应用多个过滤器来过滤对象数组

发布于 2025-01-16 13:36:49 字数 1150 浏览 3 评论 0原文

尝试通过另一个对象数组的属性来过滤对象数组:

我输出的数据

const filters = [
    {
        "id": "breed",
        "value": "bulldog"
    },
    {
        "id": "owner",
        "value": "Kevin"
    }
]

const dogs = [
    {
        "name": "Zephyr",
        "breed": "bulldog",
      "owner":"Kevin"
    },
    {
        "name": "Dude",
        "breed": "labradoodle",
      "owner":"Lance"
    },
        {
        "name": "Mark",
        "breed": "yorkie",
      "owner":"Rob"
    },
      {
        "name": "Cheddar",
        "breed": "bulldog",
      "owner":"Kevin"
    },
]

应该如下所示:

[ { 名称:“切达干酪”, 品种:“斗牛犬”, 所有者:“凯文”, }, { 名称:“西风”, 品种:“斗牛犬”, 所有者:“凯文”, }, ];

但相反,我得到的是:

[
    {
        "name": "Zephyr",
        "breed": "bulldog",
        "owner": "Kevin"
    }
]

这就是我正在做的事情:

dogs.reduce((acc, obj) => {
  filters.forEach((element) => {
    if (dogs.find((i) => i[element.id].includes(element.value))) {
      if (!acc.some((e) => e[element.id].includes(element.value))) {
        acc.push({ ...obj });
      }
    }
  });
  return acc;
}, []);

Trying to filter an array of objects by the properties of another array of objects:

Data that I have

const filters = [
    {
        "id": "breed",
        "value": "bulldog"
    },
    {
        "id": "owner",
        "value": "Kevin"
    }
]

const dogs = [
    {
        "name": "Zephyr",
        "breed": "bulldog",
      "owner":"Kevin"
    },
    {
        "name": "Dude",
        "breed": "labradoodle",
      "owner":"Lance"
    },
        {
        "name": "Mark",
        "breed": "yorkie",
      "owner":"Rob"
    },
      {
        "name": "Cheddar",
        "breed": "bulldog",
      "owner":"Kevin"
    },
]

Output should be look like that:

[
{
name: "Cheddar",
breed: "bulldog",
owner: "Kevin",
},
{
name: "Zephyr",
breed: "bulldog",
owner: "Kevin",
},
];

But instead I am getting just:

[
    {
        "name": "Zephyr",
        "breed": "bulldog",
        "owner": "Kevin"
    }
]

This is what I am doing:

dogs.reduce((acc, obj) => {
  filters.forEach((element) => {
    if (dogs.find((i) => i[element.id].includes(element.value))) {
      if (!acc.some((e) => e[element.id].includes(element.value))) {
        acc.push({ ...obj });
      }
    }
  });
  return acc;
}, []);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千紇 2025-01-23 13:36:49

使用 Array#filterArray#every,获取符合过滤器的狗列表

const 
  filters = [ { "id": "breed", "value": "bulldog" }, { "id": "owner", "value": "Kevin" } ],
  dogs = [ { "name": "Zephyr", "breed": "bulldog", "owner":"Kevin" }, { "name": "Dude", "breed": "labradoodle", "owner":"Lance" }, { "name": "Mark", "breed": "yorkie", "owner":"Rob" }, { "name": "Cheddar", "breed": "bulldog", "owner":"Kevin" } ];
  
const filteredDogs = dogs.filter(dog => 
  filters.every(({ id, value }) => dog[id] === value)
);

console.log(filteredDogs);

Using Array#filter and Array#every, get the list of dogs meeting the filters

const 
  filters = [ { "id": "breed", "value": "bulldog" }, { "id": "owner", "value": "Kevin" } ],
  dogs = [ { "name": "Zephyr", "breed": "bulldog", "owner":"Kevin" }, { "name": "Dude", "breed": "labradoodle", "owner":"Lance" }, { "name": "Mark", "breed": "yorkie", "owner":"Rob" }, { "name": "Cheddar", "breed": "bulldog", "owner":"Kevin" } ];
  
const filteredDogs = dogs.filter(dog => 
  filters.every(({ id, value }) => dog[id] === value)
);

console.log(filteredDogs);

不必了 2025-01-23 13:36:49

这是你的答案:

const result = dogs.filter(dog => {
  return filters.every(filter => dog[filter.id] == filter.value)
})

代码片段

const filters = [
    {
        "id": "breed",
        "value": "bulldog"
    },
    {
        "id": "owner",
        "value": "Kevin"
    }
]

const dogs = [
    {
        "name": "Zephyr",
        "breed": "bulldog",
      "owner":"Kevin"
    },
    {
        "name": "Dude",
        "breed": "labradoodle",
      "owner":"Lance"
    },
        {
        "name": "Mark",
        "breed": "yorkie",
      "owner":"Rob"
    },
      {
        "name": "Cheddar",
        "breed": "bulldog",
      "owner":"Kevin"
    },
];

const result = dogs.filter((dog)=> {
  return filters.every((filter)=> dog[filter.id] == filter.value)
})

console.log(result)

Here is your ans:

const result = dogs.filter(dog => {
  return filters.every(filter => dog[filter.id] == filter.value)
})

Code snippet

const filters = [
    {
        "id": "breed",
        "value": "bulldog"
    },
    {
        "id": "owner",
        "value": "Kevin"
    }
]

const dogs = [
    {
        "name": "Zephyr",
        "breed": "bulldog",
      "owner":"Kevin"
    },
    {
        "name": "Dude",
        "breed": "labradoodle",
      "owner":"Lance"
    },
        {
        "name": "Mark",
        "breed": "yorkie",
      "owner":"Rob"
    },
      {
        "name": "Cheddar",
        "breed": "bulldog",
      "owner":"Kevin"
    },
];

const result = dogs.filter((dog)=> {
  return filters.every((filter)=> dog[filter.id] == filter.value)
})

console.log(result)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文