У меня есть множество объектов "люди". Когда добавляется новый человек, функция должна проверять, был ли уже добавлен кто-то с таким именем. В таком случае этот объект следует заменить новым. Если новый человек еще не был добавлен, он просто добавляется в конец. Как лучше всего это сделать?
Вот объект
const people = [
{name: Joe M, town: London},
{name: Julie A, town: London},
{name: Sally N, town: Edinburgh},
{name: Max M, town: Liverpool}
]
Вот что я пробовал
for(let key in people) {
if (people[key].name === newPerson.name){
people.splice(key, 1, newPerson)
} else {
this.people.push(this.newPerson)
}
}
И в чем тут проблема?
разве не может быть 2 человек с одинаковыми именами?
На самом деле я не использую свойство name в своем приложении, я просто написал упрощенный массив, чтобы наглядно проиллюстрировать мою проблему.
Проблема была в логике. Вы хотите соединить или нажать только один раз, а не для каждого человека в массиве людей. Как показано ниже, Array.find() и Array.findIndex() являются прекрасными инструментами для проверки, существует ли уже человек.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать метод поиска из библиотеки Lodash (https://lodash.com/docs/4.17.11#find).
Вы ищете человека, которого хотите, и с помощью индекса можете легко его изменить.
Используя Lodash, вы можете найти индекс вычисления, если пользователь не найдет, индекс чего-либо вернет -1, поэтому мы можем это проверить и сделать вот так:
const index = _.indexOf(people, { name: newPerson.name});
if (index >= 0) people.splice(index, 1, newPerson)
else people.push(newPerson)
Кроме того, если вы не используете lodash, вы можете заменить константу индекса на:
people.findIndex(i => i.name === newPerson.name);
Есть много способов, попробуйте это:
const index = people.findIndex(p => p.name === newPerson.name)
if (index === -1) {
people.push(newPerson);
} else {
people[index] = newPerson;
}
for...in...предназначен для объектов, а не массивов