我有这个示例数组:
[
{
"id": 1,
"name": "Bob",
},
{
"id": 2,
"name": "John",
},
{
"id": 3,
"name": "Bob",
},
{
"id": 4,
"name": "Bob",
},
{
"id": 5,
"name": "Bob",
}
]
在这个数组中,我想为带有循环的数组中的每个对象添加属性颜色,但是如果用户已经分配了该属性颜色,请不要添加任何其他颜色,请保持第一个分配的颜色。
现在看起来是在向用户添加随机颜色,并且无法检查用户是否已经具有红色并且不需要另一种颜色(需要保留第一个-红色)
我需要实现的是: 每当用户存在时-仅向其中添加一种颜色,而对于其他用户,则为每个用户部分地添加唯一的唯一颜色。
const myArr = [
{
"id": 1,
"name": "Bob",
},
{
"id": 2,
"name": "John",
},
{
"id": 3,
"name": "Bob",
},
{
"id": 4,
"name": "Bob",
},
{
"id": 5,
"name": "Bob",
}
];
for (var i = 0, len = myArr.length; i < len; ++i) {
var colors = ["#A43548", "#35A4A0", "#55B747", "#1F85DE"];
var random = Math.floor((Math.random() * colors.length))
var checker = myArr.hasOwnProperty("avatarcolor")
if(checker == false) {
myArr[i].avatarcolor = colors[random]; // add color
} else {
console.log(`Already we have color to that user!`)
}
}
console.log(myArr)
答案 0 :(得分:2)
想法是,当Loop为鲍勃分配红色时,我不想分配 只有它红色的颜色了
使用数组reduce
和内部回调检查使用find
。在find
回调中,检查是否存在名称匹配的数组,并且还具有属性。如果find
未找到该对象,则将返回undefined
。在这种情况下,将新属性添加到对象
const myArr = [{
id: 1,
name: "Bob"
},
{
id: 2,
name: "John"
},
{
id: 3,
name: "Bob"
}
];
var colors = ["#A43548", "#35A4A0", "#55B747", "#1F85DE"];
myArr.reduce((acc, curr) => {
const x = acc.find(
item => item.name === curr.name && item.hasOwnProperty("avatarcolor")
);
if (!x) {
curr["avatarcolor"] = colors[Math.floor(Math.random() * colors.length)];
} else {
curr["avatarcolor"] = x.avatarcolor;
}
acc.push(curr);
return acc;
}, []);
console.log(myArr);