【问题标题】:In an array of objects how to group objects which have same value and include the values that differ [duplicate]在对象数组中,如何对具有相同值的对象进行分组并包含不同的值[重复]
【发布时间】:2022-02-02 21:10:39
【问题描述】:

我有一个对象数组,我想对具有相同名称的对象进行分组,并创建一个包含其他不同值的数组。我怎样才能做到这一点?

const arr = [
  {
    name: 'A',
    color: 'blue',
  },
  {
    name: 'A',
    color: 'purple',
  },
  {
    name: 'B',
    color: 'Yellow',
  },
  {
    name: 'B',
    color: 'Green',
  },
];

我想得到什么:

const result = [
  {
    name: 'A',
    color: ['blue', 'purple'],
  },
  {
    name: 'B',
    color: ['Yellow', 'Green'],
  },
];

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    这看起来应该用于 reduce()。 使用find() 根据某些条件在现有数组元素中查找。 如果元素存在,则推入元素的colors 属性。 否则将一个新对象推入数组。

    const arr = [
      {
        name: 'A',
        color: 'blue',
      },
      {
        name: 'A',
        color: 'purple',
      },
      {
        name: 'B',
        color: 'Yellow',
      },
      {
        name: 'B',
        color: 'Green',
      },
    ];
    
    
    let ans = arr.reduce((agg,curr) => {
    let found = agg.find((x) => x.name === curr.name);
    if(found){
      found.colors.push(curr.color);
    }
    else{
       agg.push({
       name : curr.name,
       colors : [curr.color]
       });
    }
    return agg;
    },[]);
    
    console.log(ans);

    【讨论】:

      【解决方案2】:
        const found = acc.find(item => item.name === curr.name);
        if (found) {
          found.color.push(curr.color);
        } else {
          acc.push({
            name: curr.name,
            color: [curr.color],
          });
        }
        return acc;
      }
        , []);
      

      【讨论】:

        【解决方案3】:

        这是一种方法:

        const arrNames = Array.from(new Set(arr.map((x) => x.name))); // make an array of unique names
        const result = arrNames
          .map((x) => arr.filter((y) => y.name === x)) // filter by name
          .map((x, i) => ({ name: arrNames[i], color: x.map((y) => y.color) })); // make new objects 
        

        【讨论】:

          【解决方案4】:

          创建一组道具,然后遍历可能的名称并过滤它们的值 O(n^2)

          const set = new Set(arr.map((obj) => obj.name));
          const res = [];
          for(const name of set.keys()) {
            const colors = arr.filter((obj) => obj.name === name).map((obj) => obj.color);
            res.push({name, colors});
          }
          

          或者创建一个字典,其键将是名称-s,值-数组 O(n)

          const mp = new Map();
          for (const obj of arr) {
              if (mp.has(obj.name)) {
                  mp.get(obj.name).push(obj.color);
              } else {
                  mp.set(obj.name, [obj.color]);
              }
          }
          const result = [];
          for (const [name, color] of mp.entries()) {
           result.push({name, color});
          }
          

          【讨论】:

            【解决方案5】:
            let results = [];
            const arr = [
              {
                name: "A",
                color: "blue",
              },
              {
                name: "A",
                color: "purple",
              },
              {
                name: "B",
                color: "Yellow",
              },
              {
                name: "B",
                color: "Green",
              },
            ];
            const names = arr.map((element) => element.name);
            const uniqueNames = [...new Set(names)];
            uniqueNames.forEach((element) => {
              let temp = {};
              temp.name = element;
              temp.color = [];
              arr.forEach((element2) => {
                if (element === element2.name) {
                  temp.color.push(element2.color);
                }
              });
              results.push(temp);
            });
            
            console.log("results", results);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-11-12
              • 2020-02-08
              • 2022-06-10
              • 2021-02-05
              • 2021-10-26
              • 2020-10-03
              • 1970-01-01
              相关资源
              最近更新 更多