如何根据特定逻辑更改字典中的项id

  • 本文关键字:字典 id 何根 javascript
  • 更新时间 :
  • 英文 :


如果ID有两种颜色,我想更改它的名称。

我的简化列表如下:

var myList = [{'ID': 'ES', 'volume': 1, 'color': 'red'},
{'ID': 'ES', 'volume': 2, 'color': 'red'},
{'ID': 'ES', 'volume': 1, 'color': 'green'},
{'ID': 'HH', 'volume': 1, 'color': 'red'},
{'ID': 'HR', 'volume': 4, 'color': 'green'},
{'ID': 'HR', 'volume': 4, 'color': 'red'},
{'ID': 'ES', 'volume': 1, 'color': 'red'}]

逻辑:如果有两个id共享不同的颜色,请将红色的id更改为__OLD。

例如:在上面的列表中,ID"ES"同时有绿色和红色,因此对于红色,将ES更改为ES__OLD。

预期结果:

var myList = [{'ID': 'ES__OLD', 'volume': 1, 'color': 'red'},
{'ID': 'ES__OLD', 'volume': 2, 'color': 'red'},
{'ID': 'ES', 'volume': 1, 'color': 'green'},
{'ID': 'HH', 'volume': 1, 'color': 'red'},
{'ID': 'HR', 'volume': 4, 'color': 'green'},
{'ID': 'HR__OLD', 'volume': 4, 'color': 'red'},
{'ID': 'ES__OLD', 'volume': 1, 'color': 'red'}]

我试过什么:

var keys = new Set();
myList.forEach(i=>{

keys.add(i['ID']+' '+i['color'])
})

结果:

0: "ES red"
1: "ES green"
2: "HH red"
3: "HR green"
4: "HR red"

预期

问题:现在我必须消除那些只有一种颜色的人(在示例HH中),然后在myList上迭代并进行更改。

有更好的方法吗?

希望这是您正在寻找的解决方案。

逻辑

  • 循环通过数组myList中的节点
  • 检查阵列myList是否有另一个具有相同ID的节点
  • 如果存在具有相同ID的节点,并且该节点的颜色为red,则更新该节点的ID
  • 将新节点推送到accumulator阵列

工作示例

var myList = [
{ 'ID': 'ES', 'volume': 1, 'color': 'red' },
{ 'ID': 'ES', 'volume': 2, 'color': 'red' },
{ 'ID': 'ES', 'volume': 1, 'color': 'green' },
{ 'ID': 'HH', 'volume': 1, 'color': 'red' },
{ 'ID': 'HR', 'volume': 4, 'color': 'green' },
{ 'ID': 'HR', 'volume': 4, 'color': 'red' },
{ 'ID': 'ES', 'volume': 1, 'color': 'red' }
];
const result = myList.reduce((acc, curr, index) => {
console.log(curr, index);
const newNode = { ...curr };
const matchingNodes = myList.filter((node) => node.ID === curr.ID);
if (matchingNodes.length > 1 && newNode.color === 'red') {
newNode.ID += '_OLD';
}
acc.push(newNode);
return acc;
}, []);
console.log(result);

如果您不想消除那些只有一种颜色的节点,那么在将其推送到累加器之前,您必须检查匹配节点列表的长度。

工作示例

var myList = [
{ 'ID': 'ES', 'volume': 1, 'color': 'red' },
{ 'ID': 'ES', 'volume': 2, 'color': 'red' },
{ 'ID': 'ES', 'volume': 1, 'color': 'green' },
{ 'ID': 'HH', 'volume': 1, 'color': 'red' },
{ 'ID': 'HR', 'volume': 4, 'color': 'green' },
{ 'ID': 'HR', 'volume': 4, 'color': 'red' },
{ 'ID': 'ES', 'volume': 1, 'color': 'red' }
];
const result = myList.reduce((acc, curr, index) => {
console.log(curr, index);
const newNode = { ...curr };
const matchingNodes = myList.filter((node) => node.ID === curr.ID);
if (matchingNodes.length > 1 && newNode.color === 'red') {
newNode.ID += '_OLD';
}
if (matchingNodes.length > 1) {
acc.push(newNode);
}
return acc;
}, []);
console.log(result);

最新更新