从对象数组获取不同的值

时间:2019-05-07 19:02:37

标签: javascript

假设我有以下内容:

var array = 
    [
        {"name":"a", "category":1}, 
        {"name":"a", "category":2}, 
        {"name":"b", "category": 1}
        {"name":"b", "category": 2}
    ]

我必须先找到一个包含所有不同名称的数组:

    [
        {"name":"a", "category":1}, 
        {"name":"b", "category": 1}
    ]

我尝试过Set,但仍能获得完整的阵列,我在做什么错了?

那是我的代码:

{data.length > 0 && [
        ...new Set(
          data.map(item => {
            item.name;
            const pageChanges = {
              departmentId: item.id,
              departmentName: item.name,
            };

            return (
              <Tile
                text={item.name}
                key={item.id}
              />
            );
          }),
        ),
      ]}

3 个答案:

答案 0 :(得分:6)

只需根据name道具过滤重复项

let values = array.filter((a, i, self) => {
    return i === self.findIndex(z => z.name === a.name);
});

答案 1 :(得分:3)

使用这种方法,您可以将唯一值插入到集合中,而不是同名的第一项,但也要插入id。结果基本上与转换前相同。

您可以使用Set并过滤未知名称。

var array = [{ name: "a", "category": 1 }, { name: "a", "category": 2 }, { name: "b", "category": 1 }, { name: "b", "category": 2 }],
    names = new Set,
    distincts = array.filter(({ name }) => !names.has(name) && names.add(name));
    
console.log(distincts);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

在您的示例中,使用Array.map函数可以对数组中的每个元素进行适当的编辑。这意味着生成的array.length将始终与原始array.length相同。您可以做的就是先绘制地图,然后进行过滤,但是最好还是先进行过滤或缩小。将它们放在一个集合中是个好主意,但是对象不等于{}!={},因此它们都会全部插入。