如何检查用户是否已经拥有该属性?

时间:2020-10-21 14:50:06

标签: javascript arrays object

我有这个示例数组:

[
    {
        "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)

1 个答案:

答案 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);