对象数组上的Array.reduce() - 获取单个字母的字符串

时间:2018-04-03 20:40:54

标签: javascript arrays string object

我正在努力了解JavaScript中的Array.reduce()。我有一系列对象,我试图将.reduce()应用到,但我要回到一个单字母字符串数组。

目标:

["Stuff", "necklace", "ring", "bracelet"]

当前的对象数组

const productArray =
[
    {
        id: 1,
        productTitle: "Necklace"
    },
    {
        id: 2,
        productTitle: "Ring"
    },
    {
        id: 3,
        productTitle: "Bracelet"
    }
]

函数调用

const newStuff = productArray.reduce(function(a, currentValue) {
    return [...a, ...currentValue.productTitle];
}, ["Stuff"])

实际结果: weirdArray

我需要做些什么来指明我不想要" productTitle"分解成单个字母的字符串?我一直在寻找关于一系列对象的.reduce()的资源,但我还没有找到任何非常有帮助的东西。有什么指针吗?

5 个答案:

答案 0 :(得分:0)

使用spread扩展到新数组到concatenate an array and value,将前一个数组扩展到新数组,并添加新项而不传播它。



const productArray = [{"id":1,"productTitle":"Necklace"},{"id":2,"productTitle":"Ring"},{"id":3,"productTitle":"Bracelet"}];

const newStuff = productArray.reduce((a, currentValue) => 
  [...a, currentValue.productTitle], []);

console.log(newStuff);




在这种情况下,最好使用Array.map()



const productArray = [{"id":1,"productTitle":"Necklace"},{"id":2,"productTitle":"Ring"},{"id":3,"productTitle":"Bracelet"}];

const newStuff = productArray.map((currentValue) => currentValue);

console.log(newStuff);




答案 1 :(得分:0)

不要传播标题,按原样传递:

const newStuff = productArray.reduce(function(a, currentValue) {
  return [...a, currentValue.productTitle];
}, ["Stuff"]);

...currentValue.productTitle传播到一系列单独的字母中,您只想传播a变量,这里是聚合。

答案 2 :(得分:0)

基本上字符串是可迭代的,因为iterator已实现并返回单个字符数组(如果使用spread syntax ...

  

扩展语法允许在可能需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置扩展数组表达式或字符串等迭代,或者对象要在需要零个或多个键值对(对象文字)的地方展开的表达式。



console.log([...'foo']);




答案 3 :(得分:0)

在这种情况下使用spread是不必要和低效的,因为它在每次迭代时都会从前一个创建一个新的累加器数组。您可以删除传播(并修复您的问题)并使用 concat 代替将其保持为单行。

但是,由于您只是在每次迭代时添加一个新值,因此应使用 push 。它需要一行代码,但可能比使用 concat 更有效。



var productArray = [{id: 1,productTitle: "Necklace"},
                    {id: 2,productTitle: "Ring"},
                    {id: 3,productTitle: "Bracelet"}
];

// Using concat
var newStuff = productArray.reduce((acc, value) =>
  acc.concat(value.productTitle),
["Stuff"]);

console.log(newStuff);

// Using push
var newStuff = productArray.reduce((acc, value) => {
  acc.push(value.productTitle);
  return acc;
}, ["Stuff"]);

console.log(newStuff);




答案 4 :(得分:0)

其他答案指出了您的代码错误的原因。但我确实也想指出,Array.prototype.concat已经涵盖了你所做的事情:

const productArray = [{"id":1,"productTitle":"Necklace"},{"id":2,"productTitle":"Ring"},{"id":3,"productTitle":"Bracelet"}];

const newStuff = productArray.reduce((a, val) => a.concat(val.productTitle), ['Struff']);
console.log(newStuff);

(当然,正如另一个答案所提到的,这听起来更像map而不是reduce,这可能无关紧要,因为您正在使用它来学习reduce 。)