根据键对对象数组进行分组并返回新的对象数组

时间:2021-07-16 11:34:35

标签: javascript typescript

我有以下对象数组,我想根据实体名称对其进行分组,并且我查看了两个对象是否具有相同的实体名称,如果是,那么如果两个对象的颜色相同,则我必须查看颜色我必须将它们合二为一,并将两者的细节结合起来。

如果两个对象的实体名称相同且颜色不同,那么我必须将它们分组并将颜色设置为黄色,并且必须组合细节并返回新的对象数组。

let data = [
    {entityName: "Amazon", color: "red", details: "Hello"}
    {entityName: "Amazon", color: "green", details: "World"}
    {entityName: "Flipkart", color: "green", details: "1234567"} 
]

我上面数组的异常输出应该是这个。

result = [
    {entityName: "Amazon", color: "yellow", details: "Hello world"}
    {entityName: "Flipkart", color: "green", details: "1234567"} 
]

谁能告诉我我该怎么做

2 个答案:

答案 0 :(得分:1)

您可以遍历项目并找到匹配的项目并实现您的逻辑。

let data = [{
    entityName: "Amazon",
    color: "red",
    details: "Hello"
  },
  {
    entityName: "Amazon",
    color: "green",
    details: "World"
  },
  {
    entityName: "Flipkart",
    color: "green",
    details: "1234567"
  }
];

var result = [];
for (const value of data) {
  const item = result.find(f => f.entityName === value.entityName);
  if (!item) {
    result.push(value);
  } else {
    if (item.color !== value.color) {
      item.color = 'yellow';
    }
    item.details += ' ' + value.details;
  }
}
console.log(result);

答案 1 :(得分:-1)

您可以遍历数据并搜索具有相同名称但颜色不同的项目的索引(if 语句检查 indexOfFound >= 0 因为如果找不到项目,findIndex 返回 -1 ) 对项目进行变异,然后删除找到的项目。

就像这样:

let data = [{
  entityName: "Amazon",
  color: "red",
  details: "Hello"
}, {
  entityName: "Amazon",
  color: "green",
  details: "World"
}, {
  entityName: "Flipkart",
  color: "green",
  details: "1234567"
}];

data.forEach(item => {
  const indexOfFound = data.findIndex(diffItem => diffItem.entityName == item.entityName && diffItem.color !== item.color);
  if (indexOfFound >= 0) {
    item.color = "yellow";
    item.details = `${item.details} ${data[indexOfFound].details.toLowerCase()}`
    data.splice(indexOfFound, 1);
  }
});

console.log(data);