繁体   English   中英

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方法

 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;
}

演示

这是从中提取的相当冗长的版本。 没有使用任何库,只是完全使用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]

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM