我是JS的新手,我有一个扁平化阵列的任务。我所拥有的是[1,2,[3,4]]
,我必须将其变为[1,2,3,4]
。我使用以下方法
function flatten(arr){
return arr.reduce(function(a, b) {
return a.concat(b);
});
}
但是它说concat
不是一个功能。
Array.isArray(arr); //returns true
有人可以告诉我该怎么做:)
答案 0 :(得分:3)
您的arr
值为[1,2,[3,4]]
。这是一个包含三个条目的数组:数字1
,数字2
和数组[3,4]
。
reduce
回调的前两个参数是
您不在代码中提供初始累加器,这意味着对reduce
回调的第一次调用接受第一个两个条目作为参数(即,第一个元素)该数组用作累加器)。 concat
不是函数,因为a
的初始值是数字,而不是数组。您进行了测试以查看arr
是否为数组,但未测试a
是否为数组。
此处的明确解决方案是提供初始值以用作累加器:
function flatten(arr){
return arr.reduce(function(a, b) {
return a.concat(b);
}, []);
}
这会创建一个空数组(使用[]
),然后将其作为第a
次回调的reduce
值提供。
答案 1 :(得分:1)
您只需要在回调函数之后提供数组<tr ng-repeat="s in data.sunday track by $index">
<td ng-repeat="(key,value) in d">{{value}}</td>
</tr>
<tr ng-repeat="s in data.sunday track by $index">
<td>{{s.endTime}}</td>
<td>{{s.startTime}}</td>
<td>{{s.duration}}</td>
<td>{{s.period}}</td>
</tr>
作为[]
的初始值,否则该值将是数组的第一个元素。因此,在第一次使用reduce的代码中,您尝试执行此操作reduce
a.concat(b)
为1且a
为2,这会引发错误。
b
&#13;
答案 2 :(得分:1)
您可以使用此解决方案:
var array = [].concat.apply([], [1,2,[3,4]]);
console.log(array);
答案 3 :(得分:1)
关于阵列的DOCS说
JavaScript数组对象是一个用于构造数组的全局对象;这是高级的,类似列表的对象。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
在你的reduce示例中,你必须提供一个初始值,它可以是一个空数组。
var flattened = [1,2,[3,4]].reduce(function(a, b) {
return a.concat(b);
}, []);
console.log(flattened)
答案 4 :(得分:1)
concat
期望一个值数组与另一个数组连接。这是失败的原因是因为你的数组不是一个完整的矩阵。
您的阵列的问题在于为该特定阵列创建单个硬编码解决方案并不明智,您应该创建一个递归函数,如:
function flattenArr(arr) {
const newArr = []
function recursiveFlat(a) {
if(!Array.isArray(a)) {
newArr.push(a);
}
else {
for (let i = 0; i < a.length; i++) {
if(Array.isArray(a[i])) {
recursiveFlat(a[i]);
}
else {
newArr.push(a[i]);
}
}
}
}
arr.forEach(item => recursiveFlat(item));
return newArr;
}
arr = [1, 2, [3, 4]]
console.log(flattenArr(arr))
&#13;
这样,无论形状如何,它都会使阵列变平。
答案 5 :(得分:0)
您只需确保 arr 是一个数组。但是,你打电话给 concat 。
测试一下:
if(a instanceof Array)
答案 6 :(得分:0)
您可以将Array.prototype.concat()与Spread syntax结合使用:
var flattened = [].concat.call([], ...[1, 2, [3, 4]]);
console.log(flattened);
&#13;