Возьмите первые объекты с уникальными идентификаторами из массива и поместите их в новый список - PullRequest
0 голосов
/ 14 января 2019

Я делаю выпадающий список из файла json, содержащего массив объектов, проблема в том, что некоторые объекты имеют одинаковые идентификаторы, и я хочу извлечь только первые объекты с уникальным идентификатором (например, 1, а затем взять второй объект с уникальный ID 2 и т. д.) и поместите их в список. То есть мне нужен только список с уникальными идентификаторами.

Что я пробовал до сих пор:

var distinctId = [];

for (var i = 0; i < data.length; i++) {
            var id = data[i]["id"];
            if (distinctId[id] == undefined) {
                distinctId[id] = [];
            }
            distinctId[id].push(data[i]);
            console.log(data[i]);
        }

Файл json выглядит примерно так:

[
{
id: 1,
field1: ...,
field2: ...
},
{
id: 1,
field1: ...,
field2: ...
},
{
id: 2,
field1: ...,
field2: ...
},
{
id: 2,
field1: ...,
field2: ...
},
{
id: 3,
field1: ...,
field2: ...
},
{
id: 3,
field1: ...,
field2: ...
},
]

Ответы [ 4 ]

0 голосов
/ 14 января 2019

1) Чтобы удалить дубликаты из исходного массива, вы можете использовать filter () в сочетании с необязательным аргументом, который передается как this в метод фильтрации.

2) Чтобы получить массив с уникальным ids, вы можете использовать map () для предыдущего результата.

Это показано в следующем примере:

const input = [
    {id: 1, field1: "f1", field2: "f2"},
    {id: 1, field1: "f1", field2: "f2"},
    {id: 2, field1: "f1", field2: "f2"},
    {id: 2, field1: "f1", field2: "f2"},
    {id: 3, field1: "f1", field2: "f2"},
    {id: 3, field1: "f1", field2: "f2"},
];

// Remove duplicates elements.

let res = input.filter(
    function({id}) {return !this.has(id) && this.add(id)},
    new Set()
);

console.log("No duplicates:", res);

// Get a map with only the IDs.

let ids = res.map(({id}) => id);
console.log("Ids:", ids);
0 голосов
/ 14 января 2019

Вы можете уменьшить свой массив и проверить, есть ли элемент, который соответствует вашим критериям:

your_json_array.reduce((destArray, obj) => {
    if (destArray.findIndex(i => i.id === obj.id) < 0) {
      return destArray.concat(obj);
    } else {
      return destArray;
    }
  }, []);

Это даст вам другой массив с нужными данными.

0 голосов
/ 14 января 2019

Если все, что вы хотите сделать, это получить первые два уникальных id ваших объектов, вы можете сделать это, сопоставив свой массив с массивом идентификаторов, используя .map и разрушающее присваивание .

Как только вы это сделаете, вы можете использовать набор для удаления всех дубликатов из массива. Наконец, вы можете использовать .splice, чтобы сохранить первые 2 уникальных id s из вашего массива:

const arr = [{id:1,field1:'foo',field2:'bar'},{id:1,field1:'foo',field2:'bar'},{id:2,field1:'foo',field2:'bar'},{id:2,field1:'foo',field2:'bar'},{id:3,field1:'foo',field2:'bar'},{id:3,field1:'foo',field2:'bar'}],

res = [...new Set(arr.map(({id}) => id))].splice(0, 2);
console.log(res);

Если вы хотите иметь массив уникальных объектов, вы можете использовать .reduce для создания нового массива. По сути, новый массив создается путем добавления в него первого объекта из массива, а затем проверки, имеет ли следующий объект тот же id, что и этот объект. Для этого мы используем .every. Если он имеет тот же id, мы переходим к следующему объекту, если id отличается, то мы можем добавить это в наш массив. Затем, когда мы смотрим на наш следующий объект, мы проверяем, совпадает ли он с любым из двух идентификаторов объекта в нашем массиве, если нет, мы можем добавить его и т. Д.

const arr = [{id:1,field1:'foo1',field2:'bar1'},{id:1,field1:'foo2',field2:'bar2'},{id:2,field1:'foo3',field2:'bar3'},{id:2,field1:'foo4',field2:'bar4'},{id:3,field1:'foo5',field2:'bar5'},{id:3,field1:'foo6',field2:'bar6'}],

res = arr.splice(1).reduce((acc, elem) => acc.every(({id}) => id != elem.id) ? [...acc, elem] : acc, [arr[0]]);
console.log(res);
0 голосов
/ 14 января 2019

Вы можете достичь этого, используя что-то вроде этого, однако может быть лучшей идеей, чтобы сделать то, что я сделал во втором примере. Во втором примере вы можете видеть, что он хранит список из всех дублированных идентификаторов, первый пример будет работать только для четного числа дублированных идентификаторов ... I.E. если бы было три объекта со свойством id, установленным в значение 1, вы бы все равно получили значение 1 в переменной array.

Я имею в виду, что есть и другие способы, которыми вы могли бы достичь этого, вы могли бы использовать где-нибудь функцию filter и т. Д. Если вам требуется дополнительная документация о том, как использовать функцию reduce Я бы предложил MDN Документы .

Наконец, в примере 3 это просто удаляет все дубликаты, используя более современный синтаксис и функции, такие как destructuring .

Пример 1

var objects = [{id: 1,a:'x'},{id:1,a:'x'},{id:2,a:'x'},{id:3,a:'x'}];
var array = objects.reduce((a, i) => {
  a.indexOf(i.id) == -1 ? a.push(i.id) : a.splice(a.indexOf(i.id), 1);
  return a;
}, []);

console.log(array);

Пример 2

var objects = [{id: 1,a:'x'},{id:1,a:'x'},{id:2,a:'x'},{id:3,a:'x'}];

var array = objects.reduce((a, i) => {
  objects.filter(e => e.id == i.id).length == 1 ?  a.push(i.id) : null; 
  return a;
}, []);

console.log(array);

Пример 3

const objects = [{id: 1,a:'x'},{id:1,a:'x'},{id:2,a:'x'},{id:3,a:'x'}];

const removeDuplicates = ([...o]) => o.reduce((a, i) => { 
  a.indexOf(i.id) == -1 ? a.push(i) : null; 
  return a
}, []);

console.log(removeDuplicates(objects));
...