首页 > 解决方案 > 使用 JavaScript Reduce 生成对象

问题描述

我有一个数字数组[22, 44, 12, 9, 4, 23, 1, 11, 10, 5, 2, 123],我需要使用 reduce 来创建一个如下所示的对象:

{  
   numbersLessThanTen: [...],  
   numbersGreaterThanTen: [...]
}

我有解决方案,如下所示:

const listOfNumbers = [22, 44, 12, 9, 4, 23, 1, 11, 10, 5, 2, 123];


const groupedBySize = listOfNumbers.reduce((total, next) => {
  const less = total.numbersLessThanTen || [];
  const more = total.numbersGreaterThanTen || [];
  
  next > 10 ? total.numbersGreaterThanTen = [].concat(more, next) : total.numbersLessThanTen = [].concat(less, next);
  return total;
  
}, {});

我的问题是,为什么以下不起作用?它只是返回初始值。当我使用 .push() 而不是 .concat() 时它可以工作,但我真的很想了解为什么这种方式不起作用。谢谢!

const groupedBySize = listOfNumbers.reduce((total, next) => {
  // const less = total.numbersLessThanTen || [];
  // const more = total.numbersGreaterThanTen || [];
  
  next > 10 ? total.numbersGreaterThanTen.concat(next) : total.numbersLessThanTen.concat(next);
  return total;

}, {numbersGreaterThanTen: [], numbersLessThanTen:[]});

标签: javascriptarraysfunctional-programmingreduce

解决方案


您可以用三元决定哪个数组,然后push()代替concat()

let n = [22, 44, 12, 9, 4, 23, 1, 11, 10, 5, 2, 123]

let obj = n.reduce((obj, n) => {
    (n < 10 
     ? obj.numbersLessThanTen
     : obj.numbersGreaterThanTen
    ).push(n)
    return obj
}, {numbersLessThanTen: [],  numbersGreaterThanTen:[]})

console.log(obj)


推荐阅读