JS中的数组 - 说它的对象

时间:2016-12-28 14:00:14

标签: javascript arrays object

我是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

有人可以告诉我该怎么做:)

7 个答案:

答案 0 :(得分:3)

您的arr值为[1,2,[3,4]]。这是一个包含三个条目的数组:数字1,数字2和数组[3,4]

reduce回调的前两个参数是

  1. 累加器(这是之前调用回调的返回值)和
  2. 从数组中依次获取
  3. 您不在代码中提供初始累加器,这意味着对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,这会引发错误。

&#13;
&#13;
b
&#13;
&#13;
&#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期望一个值数组与另一个数组连接。这是失败的原因是因为你的数组不是一个完整的矩阵。

您的阵列的问题在于为该特定阵列创建单个硬编码解决方案并不明智,您应该创建一个递归函数,如:

&#13;
&#13;
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;
&#13;
&#13;

这样,无论形状如何,它都会使阵列变平。

答案 5 :(得分:0)

您只需确保 arr 是一个数组。但是,你打电话给 concat 。 测试一下: if(a instanceof Array)

答案 6 :(得分:0)

您可以将Array.prototype.concat()Spread syntax结合使用:

&#13;
&#13;
var flattened = [].concat.call([], ...[1, 2, [3, 4]]);

console.log(flattened);
&#13;
&#13;
&#13;