首页 > 解决方案 > 如何过滤对象数组并根据特定属性变得不同

问题描述

我有以下数组,我想根据一个属性进行过滤并与另一个属性不同。我设法让它工作,但有没有更清洁的方法来实现这一点?

var result = [{
    "Class": "Class C",
    "Group": "Group A",
    "Value": 1
  },
  {
    "Class": "Class C",
    "Group": "Group A",
    "Value": 2
  },
  {
    "Class": "Class A",
    "Group": "Group B",
    "Value": 2
  },
  {
    "Class": "Class C",
    "Group": "Group B",
    "Value": 10
  }
];

result = result.reduce((x, {
  Class,
  Group,
  Value
}) => {
  Class.includes("Class C") && x.push({
    Class,
    Group,
    Value
  });
  return x;
}, []);
console.log(result);

result = [...new Map(result.map(item => [item["Group"], item])).values()];
console.log("Expected Result:");
console.log(result);

标签: javascriptjqueryarrays

解决方案


您有两个任务,过滤和查找不同的项目(实际上是:分组)。

因此,当我们定义两个函数时,一个用于通过给定属性进行过滤:

const filterByProp = 
    (prop) =>
        (value) =>
            (items) =>
                items.filter((item) => item[prop] === value);

一个用于通过给定属性查找不同的(在这种情况下:每个值的每个第一项):

const distinctByProp = 
    (prop) =>
        (items) =>
            Object.values(items.reduce((group, item) => {
                if (!group.hasOwnProperty(item[prop])) group[item[prop]] = item;
                return group;
            }, {}));

我们可以做的

const onlyClassC = filterByProp("Class")("Class C");
const distinctByGroup = distinctByProp("Group");

const filtered = distinctByGroup(onlyClassC(result));

并得到filtered

[
  {
    "Class": "Class C",
    "Group": "Group A",
    "Value": 1
  },
  {
    "Class": "Class C",
    "Group": "Group B",
    "Value": 10
  }
]

如果您想要每个不同组的最后一项而不是第一项,请删除if (!group.hasOwnProperty(item[prop]))from distinctByProp

const filterByProp = 
    (prop) =>
        (value) =>
            (items) =>
                items.filter((item) => item[prop] === value);

const distinctByProp = 
    (prop) =>
        (items) =>
            Object.values(items.reduce((group, item) => {
                if (!group.hasOwnProperty(item[prop])) group[item[prop]] = item;
                return group;
            }, {}));

// -----------------------------------------------------------------------
const onlyClassC = filterByProp("Class")("Class C");
const distinctByGroup = distinctByProp("Group");

// -----------------------------------------------------------------------
var result = [
  {
    "Class": "Class C",
    "Group": "Group A",
    "Value": 1
  },
  {
    "Class": "Class C",
    "Group": "Group A",
    "Value": 2
  },
  {
    "Class": "Class A",
    "Group": "Group B",
    "Value": 2
  },
  {
    "Class": "Class C",
    "Group": "Group B",
    "Value": 10
  }
];

const filtered = distinctByGroup(onlyClassC(result));
console.log(filtered);


推荐阅读