使用reduce函数返回一个数组

时间:2016-02-16 11:26:12

标签: javascript arrays reduce

为什么当我想在reduce函数中使用push函数返回一个新数组时,我得到一个错误。但是,当我在reduce函数中使用concat方法时,它会返回一个没有问题的新数组。

我试图做的就是将数组传递给reduce函数并返回相同的数组。

public void checkButtonjjListener(){
    txtAge =(EditText)findViewById(R.id.txtAge);
    num = Integer.parseInt(txtAge.getText().toString());
    check = (Button)findViewById(R.id.btnCheck);
    check.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if( num <18){
                        Toast.makeText(MainActivity.this,"Sorry, Your age Must not be less than 18 years old",Toast.LENGTH_LONG).show();
                    }
                    else{
                        Toast.makeText(MainActivity.this,"You can login",Toast.LENGTH_LONG).show();
                    }
                }
            }
    );
}``

这会返回错误。但是当我使用concat:

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.push(cV);
},[]);

返回相同的数组。

任何想法为什么?

6 个答案:

答案 0 :(得分:41)

push返回数组的新长度。

您需要的是最初提供的数组。

所以改变代码如下。

var store = [0, 1, 2, 3, 4];

var stored = store.reduce(function(pV, cV, cI){
  console.log("pv: ", pV);
  pV.push(cV);
  return pV; // *********  Important ******
}, []);

concat返回组合所提供数组和连接元素的元素的新数组。所以它有效。

答案 1 :(得分:16)

为了完整起见,对于发生在这个问题上的下一个人来说,您通常使用map来实现,正如文档中所述

  

map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组

reduce的描述对比:

  

reduce()方法对累加器和数组的每个值(从左到右)应用一个函数,将减少为单个值

(强调我的)所以你看,虽然你可以操纵reduce来返回一个新数组,但它的一般用法是将一个数组减少到一个值。

因此,对于您的代码,这将是:

var store = [0,1,2,3,4];

var stored = store.map(function(pV){
  console.log("pv: ", pV);
  return pV;
});

比在push函数中使用concatreduce重建新数组要简单得多。

答案 2 :(得分:5)

我知道这是相同的答案,但是我只是想证明使用reduce (),也可以使用ES6将语法简化为一行代码:

var store = [0,1,2,3,4];

var stored = store.reduce((pV,cV) => [...pV, cV], []);

console.log(stored);

答案 3 :(得分:2)

您始终可以使用解构:

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return [...pV, cV];
},[]);

console.log(stored);

答案 4 :(得分:1)

Array.prototype.push方法返回数组的新长度。

Array.prototype.concat方法将新元素插入到数组中并返回数组,以便进一步处理。这就是你需要做的reduce:在下一次迭代中传递修改过的数组。

答案 5 :(得分:0)

如果需要为迭代的每个项目返回一个包含多个项目的数组,则

reduce很有用;

var inputs = media.reduce((passedArray, video) => { passedArray.push("-i"); passedArray.push(video.filepath); return passedArray; }, []);

这里用于构建ffmpeg的输入数组;

[{名称:“ bob”,文件路径:“ 1.mp4”},{名称:“起诉”,文件路径:“ 3.mp4”}]

=> [“ -i”,“ 1.mp4”,“ -i”,“ 2.mp4]