удалить объекты из массива путем сравнения value1 элементов, которые разделяют value2 - PullRequest
3 голосов
/ 15 января 2020

У меня много объектов в массиве. Я хотел бы взять любые объекты, которые имеют тот же «id» и сравнить значение «num» с другими значениями «num» того же «id». Я пытаюсь свести весь массив объектов к массиву объектов с самым большим числом на один идентификатор. Они могут быть дублированы, но любые объекты, которые имеют меньшее, чем максимальное число, должны быть удалены. Все остальные пары ключ / значение должны присутствовать для поездки в любом созданном окончательном массиве объектов.

{
  random : ajabl,
  num : 5, // should stay, highest number is 5
  id :10
}
{
  random: jlsl,
  num : 4, // should go, highest number is 5
  id : 10 
}
{
  random: jlssssl,
  num : 5, // should stay, highest number is 5
  id : 10
}
{ 
  random: abcd,
  num : 1, // should go, highest number is 5
  id : 10
}
{
  random : xy45,
  num : 2, // Should stay, highest number is 2
  id : 11
}

Ответы [ 3 ]

0 голосов
/ 15 января 2020

var a = [
  {
    num: 5, // should stay, highest number is 5
    id: 10
  },
  {
    num: 4, // should go, highest number is 5
    id: 10
  },
  {
    num: 5, // should stay, highest number is 5
    id: 10
  },
  {
    num: 1, // should go, highest number is 5
    id: 10
  },
  {
    num: 2, // Should stay, highest number is 2
    id: 11
  }
];

var d = a.reduce((c, b) => {
  if (!c[b["id"]]) {
    c[b["id"]] = b["num"];
  } else {
    if (c[b["id"]] < b["num"]) {
      c[b["id"]] = b["num"];
    }
  }
  return c;
}, {});

var e = Object.keys(d).map(function(key) {
  return { id: key, num: d[key] };
});

console.log(e);
0 голосов
/ 15 января 2020

Я думаю, что вы можете достичь этого, используя ES6 следующим образом:

let arr = [{
  num : 5, // should stay, highest number is 5
  id :10
},
{
  num : 4, // should go, highest number is 5
  id : 10 
},
{
  num : 5, // should stay, highest number is 5
  id : 10
},
{ 
  num : 1, // should go, highest number is 5
  id : 10
},
{
  num : 2, // Should stay, highest number is 2
  id : 11
}];


let ids = Array.from(new Set(arr.map(i => i.id)));

let result = [];
Array.from(new Set(arr.map(i => i.id))).forEach(a => {
  let tmp = arr.filter(i => i.id === a).sort((a,b) => b.num - a.num);
  tmp.filter(i => i.num === tmp[0].num).map(j => result.push(j));
});

console.log(result);

Оператор Set предназначен для удаления дубликатов.

Сначала получите идентификаторы в массив, а затем l oop, чтобы получить каждый набор объектов в массиве, чтобы окончательно объединить их, добавив в массив результатов

0 голосов
/ 15 января 2020

Я уверен, что есть гораздо лучшие способы сделать это, но эй, это начало :) 1001

var list = [
{
  num : 5, // should stay, highest number is 5
  id :10
},
{
  num : 4, // should go, highest number is 5
  id : 10 
},
{
  num : 5, // should stay, highest number is 5
  id : 10
},
{ 
  num : 1, // should go, highest number is 5
  id : 10
},
{
  num : 2, // Should stay, highest number is 2
  id : 11
}
]
let result = []
for(obj of list) {
    let resultItem = result.find(item => item.id==obj.id)
    if(resultItem==null) {
        //first occurence of this id, keep it
        result.push(obj)
    } else {
        //keep it only if it's greater or equal than the existing num
        if(obj.num >= resultItem.num) {
            result.push(obj)
            //remove the previous ones
            result = result.filter(item => item.id!=obj.id || item.num==obj.num)
        }
    }
}
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...