在 Javascript 中连接数组
Concatenating arrays in Javascript
我是 javascript 的新手,我在使用 reduce 和 concat 函数将多个数组拼合成一个完整数组时遇到了问题。
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = function(array) {
var reducedArray = {};
var completeArray = {};
for (var i = 0; i < array.length; i++) {
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
completeArray = reducedArray[i].concat(reducedArray[i + 1]);
}
return completeArray;
}
console.log(finishedArray(array));`
我得到的错误是:completeArray = reducedArray[i].concat(reducedArray[i + 1])
;
TypeError: undefined is not a function
这是为什么???
简单的方法:
var finishedArray = [ [1, 3], [6, 6], [3, 3] ].reduce(Function.apply.bind([].concat), [])
另一个比可读性更好的好选择是使用命名函数,它允许您将此转换应用于许多地方的许多数组,而无需每次都使用那么丑陋的样板:
function flat(a,b){return a.concat(b);}
[[1,3],[6,6],[3,3]].reduce(flat);
[[7,3],[4,6],[8,1]].reduce(flat);
这是展平许多不同数组的最短路径。
请注意,您也可以使用与我的第一个建议相同的快速但丑陋的语法编写可重用文件:
var flat=Function.apply.bind([].concat);
另请注意,elclanrs 展示了一种我非常喜欢的更简单的方法:
[].concat.apply([],[[1,3],[6,6],[3,3]])
@Dandavis 提供了一个非常好的答案,展示了如何 'flatten' 锯齿状数组——将数组的数组转换为包含原始数组所有元素的单个数组。我将尝试解释为什么您会收到错误,并希望能提高您对这些方法的理解。
首先,请注意您将 reducedArray
和 completeArray
声明为空对象 ({}
)。创建空数组的语法是:
var reducedArray = [];
var completeArray = [];
即使你解决了这个问题,你仍然会遇到问题。在此声明中:
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
reduce
方法通过对每个连续项目求和并返回最终结果,将输入数组(在本例中为 array[i]
)转换为单个值。注意这个 returns:
var array = [ [1, 3], [6, 6], [3, 3] ];
for (var i = 0; i < array.length; i++) {
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
}
console.log(reducedArray); // [4, 12, 6]
这意味着reducedArray[i]
实际上是一个数字,而不是数组,Number
类型上没有concat
方法。因为 concat
是 undefined
,所以不能像函数一样调用它。
我们也可以使用 Arrow function
来做到这一点,例如:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
演示:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
// Output
console.log( finishedArray );
这将给出如下输出:
[1, 3, 6, 6, 3, 3]
如果您需要此 finishedArray
变量中的唯一值,您还可以执行以下操作:
var uniqueArray = [...new Set(finishedArray)];
演示:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
var uniqueArray = [...new Set(finishedArray)];
// Output
console.log( uniqueArray );
此输出如下:
[1, 3, 6]
我是 javascript 的新手,我在使用 reduce 和 concat 函数将多个数组拼合成一个完整数组时遇到了问题。
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = function(array) {
var reducedArray = {};
var completeArray = {};
for (var i = 0; i < array.length; i++) {
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
completeArray = reducedArray[i].concat(reducedArray[i + 1]);
}
return completeArray;
}
console.log(finishedArray(array));`
我得到的错误是:completeArray = reducedArray[i].concat(reducedArray[i + 1])
;
TypeError: undefined is not a function
这是为什么???
简单的方法:
var finishedArray = [ [1, 3], [6, 6], [3, 3] ].reduce(Function.apply.bind([].concat), [])
另一个比可读性更好的好选择是使用命名函数,它允许您将此转换应用于许多地方的许多数组,而无需每次都使用那么丑陋的样板:
function flat(a,b){return a.concat(b);}
[[1,3],[6,6],[3,3]].reduce(flat);
[[7,3],[4,6],[8,1]].reduce(flat);
这是展平许多不同数组的最短路径。
请注意,您也可以使用与我的第一个建议相同的快速但丑陋的语法编写可重用文件:
var flat=Function.apply.bind([].concat);
另请注意,elclanrs 展示了一种我非常喜欢的更简单的方法:
[].concat.apply([],[[1,3],[6,6],[3,3]])
@Dandavis 提供了一个非常好的答案,展示了如何 'flatten' 锯齿状数组——将数组的数组转换为包含原始数组所有元素的单个数组。我将尝试解释为什么您会收到错误,并希望能提高您对这些方法的理解。
首先,请注意您将 reducedArray
和 completeArray
声明为空对象 ({}
)。创建空数组的语法是:
var reducedArray = [];
var completeArray = [];
即使你解决了这个问题,你仍然会遇到问题。在此声明中:
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
reduce
方法通过对每个连续项目求和并返回最终结果,将输入数组(在本例中为 array[i]
)转换为单个值。注意这个 returns:
var array = [ [1, 3], [6, 6], [3, 3] ];
for (var i = 0; i < array.length; i++) {
reducedArray[i] = array[i].reduce(function (a, b) {
return a + b;
});
}
console.log(reducedArray); // [4, 12, 6]
这意味着reducedArray[i]
实际上是一个数字,而不是数组,Number
类型上没有concat
方法。因为 concat
是 undefined
,所以不能像函数一样调用它。
我们也可以使用 Arrow function
来做到这一点,例如:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
演示:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
// Output
console.log( finishedArray );
这将给出如下输出:
[1, 3, 6, 6, 3, 3]
如果您需要此 finishedArray
变量中的唯一值,您还可以执行以下操作:
var uniqueArray = [...new Set(finishedArray)];
演示:
var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);
var uniqueArray = [...new Set(finishedArray)];
// Output
console.log( uniqueArray );
此输出如下:
[1, 3, 6]