[英]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.