проверка данных JSON, если один и тот же идентификатор повторяется - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть данные json, один идентификатор имеет разные color_id. Так что оттуда я просто хочу проверить, повторяется ли один и тот же идентификатор, затем просто сохранить первый

Вот мой образец JSON

var data= [{ "id": "1", "name": "xxx", "age": "22","color_id": "22" },
    { "id": "1", "name": "yyy", "age": "15","color_id": "1" },
    { "id": "5", "name": "zzz", "age": "59","color_id": "22" }];

Мой желаемый вывод

var data= [{ "id": "1", "name": "xxx", "age": "22","color_id": "22" },
    { "id": "5", "name": "zzz", "age": "59","color_id": "22" }];

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

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

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

const
  // The data set with non-unique IDs
  data= [{ "id": "1", "name": "xxx", "age": "22","color_id": "22" }, { "id": "1", "name": "yyy", "age": "15","color_id": "1" }, { "id": "5", "name": "zzz", "age": "59","color_id": "22" }];
  
function dedupe(items) {
  // Create a set to keep track of IDs already encountered.
  const
    idSet = new Set();
  // Filter the items, when an ID isn't in the set add it to the set and return true
  // so item is in the result array. When the ID is in the set return false so the 
  // item will be dropped.
  return items.filter(item => {
    // If the ID is already in the set, drop it from the result. This way only the
    // first item with an ID is added to the result.
    if (idSet.has(item.id)) {
      return false;
    }
    
    // Add the ID to the set, this way we keep track of the IDs already encountered.
    idSet.add(item.id);
    // Return true so the item is included in the result array.
    return true;
  });
}    

console.log(dedupe(data));
0 голосов
/ 06 сентября 2018

Использование Array.reduce и Array.some

const data = [{
    id: '1',
    name: 'xxx',
    age: '22',
    color_id: '22',
  },
  {
    id: '1',
    name: 'yyy',
    age: '15',
    color_id: '1',
  },
  {
    id: '5',
    name: 'zzz',
    age: '59',
    color_id: '22',
  },
];

const reduced = data.reduce((tmp, x) => {
  if (tmp.some(y => y.id === x.id)) return tmp;

  return [
    ...tmp,

    x,
  ];
}, []);

console.log(reduced);

Или Array.filter, как это было хорошей идеей от @JGoodgive, но немного по-другому

    const data = [{
        id: '1',
        name: 'xxx',
        age: '22',
        color_id: '22',
      },
      {
        id: '1',
        name: 'yyy',
        age: '15',
        color_id: '1',
      },
      {
        id: '5',
        name: 'zzz',
        age: '59',
        color_id: '22',
      },
    ];

    const reduced = data.filter((x, xi) => !data.slice(0, xi).some(y => y.id === x.id));

    console.log(reduced);
0 голосов
/ 06 сентября 2018

var data = [{
    "id": "1",
    "name": "xxx",
    "age": "22",
    "color_id": "22"
  },
  {
    "id": "1",
    "name": "yyy",
    "age": "15",
    "color_id": "1"
  },
  {
    "id": "5",
    "name": "zzz",
    "age": "59",
    "color_id": "22"
  }
];

let map = {};
let uniqueEntries = data.filter((el) => map[el.id] ? false : map[el.id] = true);
console.log(uniqueEntries )

Explaination:

  1. Вы создаете карту, где мы храним идентификаторы.
  2. Затем отфильтровываем массив и каждый раз, когда мы находим запись, которой нет на карте, мы добавляем ее в список и возвращаем true. Если он уже есть в списке, мы возвращаем false, чтобы отменить эту запись.

последняя часть условия использует тот факт, что присвоение возвращает присвоенное значение.

0 голосов
/ 06 сентября 2018

Вы можете использовать reduce, чтобы создать новый массив, и в этом новом массиве используйте findIndex, чтобы проверить, есть ли у этого нового массива объект с таким же идентификатором. Если существует объект с таким же идентификатором, то не выдвигайте другой объект с таким же идентификатором

var data = [{
    "id": "1",
    "name": "xxx",
    "age": "22",
    "color_id": "22"
  },
  {
    "id": "1",
    "name": "yyy",
    "age": "15",
    "color_id": "1"
  },
  {
    "id": "5",
    "name": "zzz",
    "age": "59",
    "color_id": "22"
  }
];
let m = data.reduce(function(acc, curr) {
  let findIndex = acc.findIndex(function(item) {
    return item.id === curr.id
  })
  if (findIndex === -1) {
    acc.push(curr)

  }
  return acc;
}, [])

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