Как я могу удалить дубликаты в массиве объекта? - PullRequest
1 голос
/ 05 июля 2019

У меня есть массив, который выглядит следующим образом:

var array = 
[
    {
        key : { id : 1 , pack : "pack 1"},
        values : [
            {
                item : { id : 1 , name : "item1"},
                itemP : {id : 2 , name : "itemP12"}
            },
            {
                item : { id : 4 , name : "item4"},
                itemP : {id : 2 , name : "itemP12"}
            },
        ]
    }
]

Я хочу удалить дубликат itemP, поэтому с помощью функции он будет выглядеть так:

var array =
[
    {
        key : { id : 1 , pack : "pack 1"},
        values : [
            {
                item : { id : 1 , name : "item1"},
                itemP : {id : 2 , name : "itemP12"}
            },
            {
                item : { id : 4 , name : "item4"},
                itemP : null
            },
        ]
    }
]

Когда я пытаюсьвсегда есть ошибки.Это можно сделать?

Обновление

Я пытаюсь сделать это:

  console.log(array.map(pack => 
    pack.values.map((item) => {
      var test =  JSON.stringify(item)
      var set = new Set(test)

      return Array.from(set).map((item)=> JSON.parse(item))
      }
    )

  ))

Неожиданный конец ввода JSON

Я также пытаюсь что-то отфильтровать, но это не работает:

  console.log(this.package.map(pack => pack.values.filter(
    (value, index , array) => array.itemP.indexOf(value) === index
  )))

Ответы [ 4 ]

1 голос
/ 05 июля 2019

Вы можете отобразить ваши элементы массива на объекты массива, которые не включают ваши дубликаты, используя .map(). Для каждой итерации .map() вы снова можете использовать .map() для вашего внутреннего массива значений, чтобы преобразовать его в массив объектов таким образом, чтобы дубликаты были преобразованы в null. Здесь я сохранил объект seen, который отслеживает видимые свойства и их строковые значения. Обойдя все свойства вашего объекта (используя for...of), вы можете определить, была ли ранее видна пара ключ-значение, используя объект seen.

Преимущество этого подхода заключается в том, что он работает не только с одним свойством (т.е. не только itemP), но и с любыми другими дублирующимися парами ключ-значение.

См. Пример ниже:

const array = [{key:{id:1,pack:"pack 1"},values:[{item:{id:1,name:"item1"},itemP:{id:2,name:"itemP12"}},{item:{id:4,name:"item4"},itemP:{id:2,name:"itemP12"}}]}];

const seen = {};
const res = array.map(obj => {
 obj.values = obj.values.map(vobj => {
   for (let p in vobj) {
     vobj[p] = seen[p] === JSON.stringify(vobj[p]) ? null : vobj[p];
     seen[p] = seen[p] || JSON.stringify(vobj[p]);
   }
   return vobj;
 });
 return obj;
});

console.log(res);

Для подхода, который только что удалил itemP из всех объектов в вашем массиве, вы можете использовать:

const array = [{key:{id:1,pack:"pack 1"},values:[{item:{id:1,name:"item1"},itemP:{id:2,name:"itemP12"}},{item:{id:4,name:"item4"},itemP:{id:2,name:"itemP12"}}]}];

let itemP = "";
const res = array.map(obj => {
  obj.values = obj.values.map(vobj => {
    vobj.itemP = itemP ? null : vobj.itemP;
    if('itemP' in vobj) {
      itemP = itemP || JSON.stringify(vobj.itemP);
    }
    
    return vobj;
  });
  return obj;
});

console.log(res);
1 голос
/ 05 июля 2019

Вы можете использовать карту и объект, чтобы проверить, существует ли он уже.Например,

var obj = {}

и циклические значения

var values = [
            {
                item : { id : 1 , name : "item1"},
                itemP : {id : 2 , name : "itemP12"}
            },
            {
                item : { id : 4 , name : "item4"},
                itemP : {id : 2 , name : "itemP12"}
            }
        ]

values.map((v) => {
    if(!obj[v.itemP.id + '-' + v.itemP.name]) { 
     obj[v.itemP.id + '-' + v.itemP.name] = true; 
     return v;
    }
    return { item : v.item }

})
1 голос
/ 05 июля 2019

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

function nullifyDupes(array) {
  const clone = JSON.parse(JSON.stringify(array));
  const seen = {};

  clone.forEach(pack => {
    pack.values.forEach(items => {
      for (const item in items) {
        const id = items[item].id;

        if (seen[id]) items[item] = null;
        else seen[id] = true;
      }
    });
  });
  
  return clone;
}

const originalArray = [{
  key : { id : 1 , pack : "pack 1"},
  values : [{
    item : { id : 1 , name : "item1"},
    itemP : {id : 2 , name : "itemP12"}
  },
  {
    item : { id : 4 , name : "item4"},
    itemP : {id : 2 , name : "itemP12"}
  }]
}];

const mutatedArray = nullifyDupes(originalArray);
console.log(mutatedArray);
1 голос
/ 05 июля 2019

Для достижения ожидаемого результата используйте нижеприведенную опцию использования карты

  1. Массив циклов с использованием карты
  2. Используйте nameArr для проверки дубликатов и присвоения нулевого значения
  3. Значения цикламассив и проверьте имя в nameArr с помощью indexOf и присвойте null

var array = [
    {
        key : { id : 1 , pack : "pack 1"},
        values : [
            {
                item : { id : 1 , name : "item1"},
                itemP : {id : 2 , name : "itemP12"}
            },
            {
                item : { id : 4 , name : "item4"},
                itemP : {id : 2 , name : "itemP12"}
            }
        ]
    }
]


console.log(array.map(v => {
  let nameArr = []
  v.values = v.values.map(val => {
    if(nameArr.indexOf(val.itemP.name) !== -1){
      val.itemP.name = null
    }else{
      nameArr.push(val.itemP.name)      
    }
    return val
  })
  return v
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...