удалить дубликаты из многоуровневого вложенного объекта Dynami c, используя JS - PullRequest
0 голосов
/ 03 августа 2020

У меня есть вложенный объект json, в котором мне нужно удалить объекты с повторяющимися ключами. Например: в данном массиве мне нужно удалить повторяющиеся элементы из редактирования, нового и удаления на основе ключа «значение». Я пробовал несколько методов, но не могу сделать это динамически.

let json = {
  edit:{
     params:[],
     items:[
        {
           id:"1",
           source:"text",
           value:"new1"
        },
     ]
  },
  delete:{
     params:[],
     items:[
        {
           id:"2",
           source:"text",
           value:"new2"
        },
     ]
  },
  new:{
     params:[],
     items:[
        {
           id:"3",
           source:"text",
           value:"new1"
        },
        {
           id:"4",
           source:"text",
           value:"new"
        },
        {
           id:"5",
           source:"text",
           value:"new2"
        },
        {
           id:"6",
           source:"text",
           value:"new"
        },
     ]
  },
  text:{
     name:"test",
     value:"test",
     id:"10"
  }
}

Ожидаемый результат должен быть:

let result = {
  edit:{
     params:[],
     items:[
        {
           id:"1",
           source:"text",
           value:"new1"
        }
     ]
  },
  delete:{
     params:[],
     items:[
        {
           id:"2",
           source:"text",
           value:"new2"
        }
     ]
  },
  new:{
     params:[],
     items:[
        {
           id:"4",
           source:"text",
           value:"new"
        }
     ]
  },
  text:{
     name:"test",
     value:"test",
     id:"10"
  }
}

1 Ответ

0 голосов
/ 03 августа 2020

Простой способ - сделать так, чтобы массив содержал все проанализированные значения во время цикла по элементам и фильтровал элементы на основе их включения в этот массив:

// Create empty array of values to use to check for duplicates
const values = [];

// Create empty result object
const result = {};

// Loop through the edit, delete, new and text keys from the json
Object.keys(json).forEach(key => {
  const obj = json[key];

  // Loop through items and filter out non-duplicates
  const items = obj.items.filter(item => !values.includes(item.value));

  // Store the items values in the duplicate check array
  items.forEach(item => values.push(item.value));

  // Add the key to the results
  result[key] = { 
    ...obj, // Spread all values from the original obj
    items, // Overwrite the items
  };
});
...