удалить дубликат определенного значения объекта в массиве реагировать - PullRequest
0 голосов
/ 13 марта 2019

У меня есть массив объектов, который имеет значение, подобное этому

[
    {
        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
    }
]

Как видите, пользователи с тем же героем, что и у другого, удалены, а массив содержит только объекты с уникальными героями. Я использую responsejs в качестве основы JavaScript, как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 13 марта 2019

Вот решение с использованием уменьшить и найти .

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];
  }, []);
};

Я также создал демо Проверьте .

0 голосов
/ 13 марта 2019

Вы можете сделать это с помощью 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.log(res)
0 голосов
/ 13 марта 2019

Вы можете использовать эту функцию ниже, так как она работает для меня.

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')

0 голосов
/ 13 марта 2019

Вы можете сделать это, используя 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.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...