Почему мой уменьшить сброс аккумулятора? - PullRequest
0 голосов
/ 08 мая 2018

Как мне сохранить накопленную стоимость моей функции reduce? Каждая итерация сбрасывает значение объекта.

const a = [1, 2, 3, 4, 5];

const b = {
  1: {
    name: 'Dan',
    age: 25
  },
  2: {
    name: 'Peter',
    age: 28
  },
  3: {
    name: 'Mark',
    age: 38
  },
  4: {
    name: 'Larry',
    age: 32
  },
  5: {
    name: 'Simon',
    age: 25
  },
}

const f = a.reduce((acc, val) => {
  console.log({
    acc
  })
  return {
    [val]: {
      age: b[val].age
    }
  }
}, {})

console.log(f); // 5: {age: 25}

Мой желаемый результат будет:

{
  1: { age: 25 },
  2: { age: 28 },
  3: { age: 38 },
  4: { age: 32 },
  5: { age: 25 },
}

(Этот пример является демо)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Согласно MDN

Метод redu () применяет функцию к аккумулятору и каждому элементу в массиве (слева направо), чтобы уменьшить его до одного значения.

На каждой итерации вы возвращаете новый объект внутри функции reduce() и не сохраняете предыдущее значение этого аккумулятора. Поэтому вам нужно объединить или присвоить предыдущее значение новому значению.

Один способ, которым вы можете использовать Object.assign() метод, чтобы получить требуемый результат.

DEMO

const a = [1, 2, 3, 4, 5];

const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}

let result = a.reduce((acc, val) => Object.assign(acc,{[val]: {age:b[val].age}}), {});

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

Второй способ сделать это можно obje[val]=newValue и вернуть аккумулятор.

DEMO

const a = [1, 2, 3, 4, 5];

const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}

let result = a.reduce((acc, val) =>{
acc[val]= {age:b[val].age};
return acc;
}, {});

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

Еще один способ объединения, используя spread syntax

DEMO

const a = [1, 2, 3, 4, 5];

const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}

let result = a.reduce((acc, val) => {
return {...acc,...{[val]:{age:b[val].age}}}
}, {});

console.log(result);
.as-console-wrapper {max-height: 100% !important;top: 0;}
0 голосов
/ 08 мая 2018

Добавьте предыдущий аккумулятор к возвращенному значению, используя объектный разброс (как в этом примере) или Object.assign():

const a = [1, 2, 3, 4, 5];

const b = {"1":{"name":"Dan","age":25},"2":{"name":"Peter","age":28},"3":{"name":"Mark","age":38},"4":{"name":"Larry","age":32},"5":{"name":"Simon","age":25}};

const f = a.reduce((acc, val) => ({
  ...acc, // previous accumulator
  [val]: {
    age: b[val].age
  }
}), {})

console.log(f); // 5: {age: 25}
...