Javascript 展平数组数组但我在 for 循环中遇到错误?

Javascript flattening an array of arrays but I'm getting error in my for loop?

我有一个数组。一些阵列中有多个阵列,我想展平。这是我想到的:

_(o).forEach(function(array) {
    for (var i=0; i<= array.length; i++){
        if(array[i].length > 1) {
            _.flatten(array)
        }
    }
});

这是我的 JS 控制台中的数组数组。

[Array[1], Array[1], Array[1], Array[1], Array[1], Array[1], Array[1]]

再看一下它们,您可以看到一些数组中包含多个数组。

    0: Array[1]0: Array[1]length: 1__proto__: Array[0]
    1: Array[1]0: Array[1]length: 1__proto__: Array[0]
    2: Array[1]0: Array[1]length: 1__proto__: Array[0]
    3: Array[1]0: Array[1]length: 1__proto__: Array[0]
    4: Array[1]0: Array[2]length: 1__proto__: Array[0]
    5: Array[1]0: Array[2]length: 1__proto__: Array[0]
    6: Array[1]0: Array[1]length: 1__proto__: Array[0]
    length: 7 __proto__: Array[0]

我收到以下错误:无法读取未定义的 属性 'length'

我做错了什么?

我从以下对象开始:

Object {OPxE8PPWuC: Array[1], Pxfus72LQL: Array[1], YUiapfcXac: Array[1], fTfCZU1zFs: Array[1], kTC0RwDalJ: Array[2]…}
OPxE8PPWuC: Array[1]
Pxfus72LQL: Array[1]
YUiapfcXac: Array[1]
fTfCZU1zFs: Array[1]
kTC0RwDalJ: Array[2]
yCDDEWoiwM: Array[2]
zP8ZcapePl: Array[1]
__proto__: Object

该对象中有 8 个数组,但其中两个数组中有两个数组。我想要 8 个阵列,但每个阵列的深度都为一层。两个数组有两个数组,我会把它们合并成一个更大的数组。

您可以执行如下操作。遍历对象,运行 underscore.js flatten method 它的值。

var obj = {
  one: [1, 2, 3, 4, 5],
  two: [6, 7, [8, 9], 10]
}

for (var prop in obj) {
  obj[prop] = _.flatten(obj[prop])
}

alert(JSON.stringify(obj))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>

对象属性将只包含一个数组。

这是以下代码的精简版。这使用 underscore 中的 _.flatten,它基本上取代了我较长代码中的 recurse 函数。

function toType(x) {
  return ({}).toString.call(x).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
};

function flatten(arr) {
    var out = [];
    for (var i = 0, l = arr.length; i < l; i++) {
        if (toType(arr[i]) === 'array') {
            out.push(_.flatten(arr[i]));
        } else {
            out.push(arr[i]);
        }
    }
    return out;
}

DEMO

这是从中提取的相当冗长的版本。没有使用任何库,只是完全普通的 JS。

// toType is used to get an accurate name for the JS
// data structures
function toType(x) {
  return ({}).toString.call(x).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
};

// the flatten function
function flatten(arr) {
  var out = [];

  // loop over each element in the array
  // if it's an array, call recurse with the element and
  // and an empty array as arguments
  for (var i = 0, l = arr.length; i < l; i++) {
    if (toType(arr[i]) === 'array') {
      out.push(recurse(arr[i], []));

    // otherwise add it to the output array
    } else {
      out.push(arr[i]);
    }
  }
  return out;
}

// this function keeps looping over arrays until they are
// flattened
function recurse(arr, out) {
  for (var i = 0, l = arr.length; i < l; i++) {
    if (toType(arr[i]) === 'array') {
        recurse(arr[i], out);
      } else {
        out.push(arr[i]);
    }
  }
  return out;
}

var arr = [[1], [[2, 3, [3, 4, 1]], 4], 78];
var result = flatten(arr); // [[1], [2, 3, 3, 4, 1, 4], 78]

DEMO