JavaScript Уменьшить внутреннюю карту - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь отсортировать массив объектов на основе суммы одного из свойств объекта. По сути, вот так:

array = [
          {
            id:4,
            tally: [1, 3, 5]
          },
         {
            id: 6,
            tally: [2, 3, 6]
         },
         {
            id: 9,
            tally: [2, 1, -1]
         }
]

Если мы просуммируем соответствующие tally s, мы получим 9, 11 и 2 соответственно, и в этом случае я бы хотел что-то вроде этого:

array = [
          {
            id:6,
            tally: [2, 3, 6]
          },
         {
            id: 6,
            tally: [1, 3, 5]
         },
         {
            id: 9,
            tally: [2, 1, -1]
         }
]

Я знаю, что это какая-то комбинация map, reduce, но я изо всех сил пытаюсь понять, как это кодировать в правильном правильном формате React.

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Вы можете сначала вычислить сумму в каждом объекте, используя map и reduce, затем отсортировать этот новый массив, используя метод sort, а затем просто удалить свойство суммы с помощью другого map метода

const array = [{
    id: 4,
    tally: [1, 3, 5]
  },
  {
    id: 6,
    tally: [2, 3, 6]
  },
  {
    id: 9,
    tally: [2, 1, -1]
  }
]

const sorted = array
  .map(({ tally, ...rest }) => ({
    sum: tally.reduce((r, e) => r + e, 0), tally, ...rest
  }))
  .sort((a, b) => b.sum - a.sum)
  .map(({ sum, ...rest }) => rest)

console.log(sorted)
0 голосов
/ 20 июня 2020

Вы можете сначала накопить суммы в Map, где каждый ключ - это id объекта, а каждое значение - это сумма массива tally этого объекта. Вы можете использовать .reduce() для расчета суммы. Здесь acc - это накопленное значение, которое начинается с 0 и добавляется к каждому вызову обратного вызова reduce. используя .sort() вот так:

const array = [{ id: 4, tally: [1, 3, 5] }, { id: 6, tally: [2, 3, 6] }, { id: 9, tally: [2, 1, -1] }];
const sumMap = new Map(array.map(
  ({id, tally}) => [id, tally.reduce((acc, n) => acc+n, 0)])
);
const res = array.sort((a, b) => sumMap.get(b.id) - sumMap.get(a.id));

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

Вы можете сделать это с помощью sort:

var arr=[{id:4,
          tally: [1, 3, 5]},
         {id: 6,
          tally: [2, 3, 6]},
         {id: 9,
          tally: [2, 1, -1]}
]

var result =arr.sort((a,b)=>{
    aa = a.tally.reduce((acc,elem)=>acc+elem,0);
    bb = b.tally.reduce((acc,elem)=>acc+elem,0);
    return bb-aa;
});

console.log(result);
...