为什么当我想在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);
},[]);
返回相同的数组。
任何想法为什么?
答案 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
函数中使用concat
或reduce
重建新数组要简单得多。
答案 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]