Как удалить объекты с одинаковыми ключом и парой значений в массивах - PullRequest
0 голосов
/ 28 июня 2018

Я просмотрел много вопросов о переполнении стека, но, похоже, ни один из них не ответил на мой вопрос. У меня есть массив объектов, который я хотел бы уменьшить, удалив все объекты, где ключ и значение совпадают.

Итак, мой массив объектов будет:

[{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

Конечный результат должен быть:

[{a:1},{a:2},{c:3},{b:1},{c:4}]

Я пытался использовать filer и map, но я могу получить только первый объект в массиве, а не все объекты, которые имеют разные пары ключ / значение в массиве. Я также пытался использовать filter и findIndex, но с той же проблемой.

Я также не могу отфильтровать объекты, прежде чем помещать их в массив.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Предполагая, что все ваши объекты относятся к разным типам (различным свойствам) и не являются сложными по своей природе, т.е. не являются вложенными объектами.

  1. Создать список массивов (который будет действовать как многомерный массив).

    let uniqueArr = [];

  2. Цикл по вашему массиву, который содержит дубликаты с Arr.forEach();

  3. Получить свойство объекта, используя

    Object.getPropertyNames(item);

  4. Проверьте, существует ли этот тип объекта уже в вашем uniqueArr, если нет, добавьте тип свойства.

uniqueArr.push({property:[]});

  1. Если свойство уже существует в uniqueArr, проверьте, находится ли текущее значение свойства в массиве свойств внутри uniqueArr.
  2. Если свойство не существует, добавьте новое свойство в соответствующий массив свойств. Если свойство выходит, пропустите и выполните цикл для следующего объекта.
  3. После завершения цикла создайте resultArr с помощью uniqueArr.

Образец: uniqueArr [ {a:[1,2]}, {b:[1]}, {c:[3]} ];

0 голосов
/ 28 июня 2018
var a = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}];
var newData = [];
a.map(ele=>JSON.stringify(ele)).forEach(ele=>{
   if(newData.indexOf(ele) === -1){
     newData.push(ele)
   }
});
newData.map(ele=>JSON.parse(ele))
console.log(newData);
0 голосов
/ 28 июня 2018

Предполагая, что все ваши объекты относятся к разным типам (различным свойствам) и не являются сложными по своей природе, т.е. не являются вложенными объектами.

  1. Создать список массивов (который будет действовать как многомерный массив).

    let uniqueArr = [];

  2. Перебрать массив, содержащий дубликаты, с помощью Arr.forEach ();

  3. Получить свойство объекта

    Object.getPropertyNames (пункт);

  4. Проверьте, не существует ли этот тип объекта уже в вашем uniqueArr, если нет, добавьте тип свойства.

    uniqueArr.push ({свойство: []});

  5. Если свойство уже существует в uniqueArr, проверьте, находится ли текущее значение свойства в массиве свойств внутри uniqueArr.

  6. Если свойство не существует, добавьте новое свойство в соответствующий массив свойств. Если свойство выходит, пропустите и выполните цикл для следующего объекта.

  7. После завершения цикла создайте resultArr с помощью uniqueArr.

    Образец uniqueArr [ {А: [1,2]}, {Ь: [1]}, {С: [3]} ]

0 голосов
/ 28 июня 2018

Вы можете сравнить два элемента, используя JSON.stringify () . Затем мы добавляем в новый массив, используя Reduce , если он находится в массиве, мы не добавляем его, в противном случае мы добавляем его.

const array = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

let unique = array.reduce((res, itm) => {
  // Test if the item is already in the new array
  let result = res.find(item => JSON.stringify(item) == JSON.stringify(itm))
  // If not lets add it
  if(!result) return res.concat(itm)
  // If it is just return what we already have
  return res
}, [])

console.log(unique)

В качестве альтернативы вы могли бы использовать Set (как обозначения Короля Разломов), чтобы составить уникальный список предметов, подобных этому:

const array = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

let unique = [...new Set(array.map(itm => JSON.stringify(itm)))].map(i => JSON.parse(i))

console.log(unique)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...