首页 > 解决方案 > 根据对象不同的值过滤数组

问题描述

我想简化一组对象过滤。假设我有以下数组,

const users = [{
    name: "user1",
    gender: "m"
  }, {
    name: "user2",
    gender: "f"
  }, {
    name: "user3",
    gender: "f"
  }, {
    name: "user4",
    gender: "m"
  }, {
    name: "user5",
    gender: "m"
  }];

例如,我需要按男性或女性过滤所有用户,所以我通过过滤器对象属性循环:

const fUsers = users.filter(user => user.gender === "f");
const mUsers = users.filter(user => user.gender === "m");

const results = [fUsers, mUsers];
console.log(results);

有没有更好的过滤方法一次完成,所以我可以在多个数组中得到结果。

标签: javascriptnode.js

解决方案


您可以使用 reduce 函数并在累加器中传递一个嵌套数组。在回调中检查性别,您可以使用acc[0]在累加器的第一个嵌套数组中添加元素或acc[1]

const users = [{
  name: "user1",
  gender: "m"
}, {
  name: "user2",
  gender: "f"
}, {
  name: "user3",
  gender: "f"
}, {
  name: "user4",
  gender: "m"
}, {
  name: "user5",
  gender: "m"
}];

const newArr = users.reduce((acc, curr) => {
  if (curr.gender === 'f') {
    acc[0].push(curr)
  } else {
    acc[1].push(curr)
  }
  return acc;
}, [
  [],
  []
]);

console.log(newArr)

或者,您也可以使用普通的 for 循环

const users = [{
  name: "user1",
  gender: "m"
}, {
  name: "user2",
  gender: "f"
}, {
  name: "user3",
  gender: "f"
}, {
  name: "user4",
  gender: "m"
}, {
  name: "user5",
  gender: "m"
}];

let arr = [
  [],
  []
];
for (let i = 0; i < users.length; i++) {
  users[i].gender === 'f' ? arr[0].push(users[i]) : arr[1].push(users[i])
};

console.log(arr)


推荐阅读