У меня есть массив объектов, который имеет такое значение
[
{
username: 'Goku',
hero: 'superman',
power: 'laser',
isMasked: false
},
{
username: 'Gohan',
hero: 'batman',
power: 'brain',
isMasked: true
},
{
username: 'Goten',
hero: 'cyclops',
power: 'laser',
isMasked: true
},
{
username: 'picollo',
hero: 'superman',
power: 'streangth',
isMasked: false
},
{
username: 'bulma',
hero: 'batman',
power: 'rich',
isMasked: true
},
{
username: 'brolly',
hero: 'jin',
power: 'laser',
isMasked: false
}
]
Как видите, массив содержит json с разными героями, некоторые из них имеют одинаковую силу, но проблема в том, что у некоторых пользователей были одинаковые герои, что я хочу сделать, так это удалить эти объекты внутри мой массив, содержащий таких же героев, как и другие, так что вывод будет
[
{
username: 'Goku',
hero: 'superman',
power: 'laser',
isMasked: false
},
{
username: 'Gohan',
hero: 'batman',
power: 'brain',
isMasked: true
},
{
username: 'Goten',
hero: 'cyclops',
power: 'laser',
isMasked: true
},
{
username: 'brolly',
hero: 'jin',
power: 'laser',
isMasked: false
}
]
Как видите, пользователи с тем же героем, что и у другого, удаляются, а массив содержит только объекты с уникальными героями, я использую reactjs в качестве JavaScript-фреймворка, как мне это сделать?



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


Вы можете сделать это, используя Array.prototype.reduce() и Array.prototype.find(), выполнив следующие действия:
reduce() к arr и установите ac изначально на [].reduce() проверьте, есть ли у ac объект, hero которого равен текущему объекту.ac.ac вместе с новым товаром.var arr = [ { username: 'Goku', hero: 'superman', power: 'laser', isMasked: false }, { username: 'Gohan', hero: 'batman', power: 'brain', isMasked: true }, { username: 'Goten', hero: 'cyclops', power: 'laser', isMasked: true }, { username: 'picollo', hero: 'superman', power: 'streangth', isMasked: false }, { username: 'bulma', hero: 'batman', power: 'rich', isMasked: true }, { username: 'brolly', hero: 'jin', power: 'laser', isMasked: false } ];
let res = arr.reduce((ac,a) => ac.find(x=> x.hero === a.hero) ? [...ac] : [...ac,a],[]);
console.info(res);Вы можете сделать это с помощью Array#reduce. Поместите объект в новый массив, если значение героя не существует.
var arr = [ { username: 'Goku', hero: 'superman', power: 'laser', isMasked: false }, { username: 'Gohan', hero: 'batman', power: 'brain', isMasked: true }, { username: 'Goten', hero: 'cyclops', power: 'laser', isMasked: true }, { username: 'picollo', hero: 'superman', power: 'streangth', isMasked: false }, { username: 'bulma', hero: 'batman', power: 'rich', isMasked: true }, { username: 'brolly', hero: 'jin', power: 'laser', isMasked: false } ];
var res = arr.reduce((a, b) => a.map(i => i.hero).indexOf(b.hero) > -1 ? [...a]:[...a,b], []);
console.info(res)Вы можете использовать эту функцию ниже, так как она работает для меня.
function removeDuplicateByKey(arr,key) {
let uniqueObj = {};
let filterArr = arr.filter(obj => {
if (!uniqueObj[obj[key]]) {
uniqueObj[obj[key]] = 1;
return obj;
}
});
return filterArr;
}
вы можете назвать это развлечение как removeDuplicateByKey(array,'hero')
Вот решение с использованием уменьшать и найти.
const removeDuplicateByKey = (arr, key) => {
return arr.reduce((acc, val) => {
//Found duplicate value
if (acc.find(el => el[key] === val[key])) {
return [...acc];
}
return [...acc, val];
}, []);
};
Я также создал демо проверить это.
Возможный дубликат Удалить повторяющиеся значения из массива JS