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;
}
这是从中提取的相当冗长的版本。没有使用任何库,只是完全普通的 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]
我有一个数组。一些阵列中有多个阵列,我想展平。这是我想到的:
_(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;
}
这是从中提取的相当冗长的版本。没有使用任何库,只是完全普通的 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]