Фильтровать массив объекта с условиями - PullRequest
1 голос
/ 18 июня 2020

Я хотел бы отфильтровать массив объектов в соответствии с наивысшим значением ключа «значение» и отличать каждый объект по их ключу «id».

Пример:

var array = [
  {
    id: 1,
    value: 10
  },
  {
    id: 1,
    value: 2
  },
  {
    id: 2,
    value: 6
  },
  {
    id: 2,
    value: 5
  },
  {
    id: 2,
    value: 1
  }
]

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

array = [
 {
  id: 1,
  value: 10
 },
 {
  id: 2,
  value: 6
 }
]

Спасибо

Ответы [ 4 ]

0 голосов
/ 18 июня 2020

Вот мой ответ, но он должен иметь отсортированные индексы, и это не так круто, как reduce примеры, которые у вас есть.

var array = [
  {
    id: 1,
    value: 10
  },
  {
    id: 1,
    value: 1
  },
  {
    id: 2,
    value: 1
  },
  {
    id: 2,
    value: 5
  },
  {
    id: 2,
    value: 35
  },
  {
      id: 3,
      value: 4
  },
  {
      id: 3,
      value: 14
  },
  {
      id: 2,
      value: 123
  }
];

function getHighestValues(Arr) {
    var newArr = [];

    var IdArr = Arr.map(elem => elem.id);
    IdArr.sort((a,b)=>a-b);
    for(var i = 0; i < Arr.length; i++) {
        let currIdIndex = IdArr.indexOf(Arr[i].id);
        if(newArr[currIdIndex] == undefined) {
            newArr.push(
                {
                    id: Arr[i].id,
                    value: Arr[i].value
                })
        } else if(newArr[currIdIndex].value < Arr[i].value) {
            newArr[currIdIndex].value = Arr[i].value;
        }

        IdArr.splice(currIdIndex, 1);

        if(IdArr.indexOf(Arr[i].id) == -1) {
            IdArr.splice(currIdIndex, 0, Arr[i].id);
        }
        
    }
    return newArr;
}

array = getHighestValues(array);

console.log(array);
0 голосов
/ 18 июня 2020

надеюсь, это поможет

var arr = [
  {
    id: 1,
    value: 10
  },
  {
    id: 1,
    value: 2
  },
  {
    id: 2,
    value: 6
  },
  {
    id: 2,
    value: 5
  },
  {
    id: 2,
    value: 1
  }
];

const output = Object.values(arr.reduce((x, y) => {
  x[y.id] = x[y.id] && x[y.id].value > y.value ? x[y.id] : y
  return x
}, {}));

console.log(output);
0 голосов
/ 18 июня 2020

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

const
    array = [{ id: 1, value: 10 }, { id: 1, value: 2 }, { id: 2, value: 6 }, { id: 2, value: 5 }, { id: 2, value: 1 }],
    result = array.reduce((r, o) => {
        const index = r.findIndex(({ id }) => o.id === id);
        if (index === -1) r.push(o);
        else if (r[index].value < o.value) r[index] = o;
        return r;
    }, []);
    

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Другой подход с Map.

const
    array = [{ id: 1, value: 10 }, { id: 1, value: 2 }, { id: 2, value: 6 }, { id: 2, value: 5 }, { id: 2, value: 1 }],
    result = Array.from(
        array.reduce((m, { id, value }) => m.set(id, m.has(id)
            ? Math.max(m.get(id), value)
            : value
        ), new Map),
        ([id, value]) => ({ id, value })
    );
    

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 18 июня 2020

Вот возможный способ сделать это

var array = [
  {
    id: 1,
    value: 10
  },
  {
    id: 1,
    value: 2
  },
  {
    id: 2,
    value: 6
  },
  {
    id: 2,
    value: 5
  },
  {
    id: 2,
    value: 1
  }
]

let objdis = {};

array.forEach(val => {
  if(objdis[val.id] !== undefined){
      objdis[val.id].push(Number(val.value));
  }else{
    objdis[val.id] = [];
    objdis[val.id].push(val.value);
  }
})

let returningObj = [];

for (prop in objdis){
  let obj = {};
  obj.id = Number(prop);
  obj.Value = Math.max(...objdis[prop])
  returningObj.push(obj);
}

console.log(returningObj);
...