如果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);