使用剩余参数将参数展平为一维数组
Flatten arguments into one dimensional array using the rest parameter
我在尝试将多维数组展平为一维数组时开发了以下代码 (http://codepen.io/PiotrBerebecki/pen/KrkdPj)。
例如,
flattenArray([1, [2, 3], 4, [5, [6]], 7])
// should return [1, 2, 3, 4, 5, 6, 7]
// Flatten an array
function flattenArray(input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {return prev.concat(flattenArray(curr));}
else {return prev.concat(curr);}
}, []);
}
console.log( flattenArray([1, [2, 3], 4, [5, [6]], 7]) );
// [1, 2, 3, 4, 5, 6, 7]
以上似乎工作正常。
现在,我被要求制作另一个函数,而不是数组,它将为数字和数组的混合实现相同的结果。
例如,
flattenMix(1, [2, 3], 4, [5, [6]], 7);
// should return [1, 2, 3, 4, 5, 6, 7]
我通过添加剩余参数对上面的内容进行了轻微修改,以便该函数可以接受任意数量的参数。但是我收到 maximum call stack
错误。你知道下面的函数有什么问题吗?
// Flatten arguments (arbitrary length) consisting of a mix of numbers and arrays
function flattenMix(...input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {return prev.concat(flattenMix(curr));}
else {return prev.concat(curr);}
}, []);
}
console.log( flattenMix(1, [2, 3], 4, [5, [6]], 7) ); // should return [1, 2, 3, 4, 5, 6, 7]
更新 1
下面的答案和建议表明我应该在递归调用 flattenMix(...curr)
中使用 ...
扩展运算符。这样,当 curr
是一个数组(经过测试)时,curr
的包含元素将被传递给 flattenMix
函数(而不是 curr
数组).
您的问题是您在递归中将数组作为第一个参数而不是数组项发送。
您可以使用 flatten.apply(null, arr)
或 flatten(...arr)
:
// Flatten arguments (arbitrary length) consisting of a mix of numbers and arrays
function flatten(...input) {
return input.reduce(function(prev, curr) {
return prev.concat(
Array.isArray(curr) ? flatten(...curr) : curr
);
}, []);
}
console.log(flatten(1, [2, 3], 4, [5, [6]], 7)); // should return [1, 2, 3, 4, 5, 6, 7]
以有趣的方式去做
如果将数组的数组转换为字符串,这将为您展平数组,您唯一应该做的就是将字符串数字转换为 Number
.
function flattenArgs() {
return Array.from(arguments).toString()
.split(',').map(Number);
}
console.log(flattenArgs(1, [2, 3], 4, [5, [6]], 7));
嗯,很简单。您的第一个方法已经可以处理一个数组,并且由于 arguments
基本上是一个数组,我们可以添加一个额外的行。
// Flatten an array
function flattenArray(input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {
return prev.concat(flattenArray(curr));
} else {
return prev.concat(curr);
}
}, []);
}
function flattenMix() {
return flattenArray([].slice.call(arguments));
}
console.log(flattenMix(1, [2, 3], 4, [5, [6]], 7));
好吧,你可以只使用展开运算符。
function flattenMix(...input) {
return input.reduce(function (prev, curr) {
if (Array.isArray(curr)) {
return prev.concat(flattenMix(...curr));
// ^^^^^^^
} else {
return prev.concat(curr);
}
}, []);
}
console.log(flattenMix(1, [2, 3], 4, [5, [6]], 7));
有一个新方法Array.flat()
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
我在尝试将多维数组展平为一维数组时开发了以下代码 (http://codepen.io/PiotrBerebecki/pen/KrkdPj)。
例如,
flattenArray([1, [2, 3], 4, [5, [6]], 7])
// should return [1, 2, 3, 4, 5, 6, 7]
// Flatten an array
function flattenArray(input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {return prev.concat(flattenArray(curr));}
else {return prev.concat(curr);}
}, []);
}
console.log( flattenArray([1, [2, 3], 4, [5, [6]], 7]) );
// [1, 2, 3, 4, 5, 6, 7]
以上似乎工作正常。
现在,我被要求制作另一个函数,而不是数组,它将为数字和数组的混合实现相同的结果。
例如,
flattenMix(1, [2, 3], 4, [5, [6]], 7);
// should return [1, 2, 3, 4, 5, 6, 7]
我通过添加剩余参数对上面的内容进行了轻微修改,以便该函数可以接受任意数量的参数。但是我收到 maximum call stack
错误。你知道下面的函数有什么问题吗?
// Flatten arguments (arbitrary length) consisting of a mix of numbers and arrays
function flattenMix(...input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {return prev.concat(flattenMix(curr));}
else {return prev.concat(curr);}
}, []);
}
console.log( flattenMix(1, [2, 3], 4, [5, [6]], 7) ); // should return [1, 2, 3, 4, 5, 6, 7]
更新 1
下面的答案和建议表明我应该在递归调用 flattenMix(...curr)
中使用 ...
扩展运算符。这样,当 curr
是一个数组(经过测试)时,curr
的包含元素将被传递给 flattenMix
函数(而不是 curr
数组).
您的问题是您在递归中将数组作为第一个参数而不是数组项发送。
您可以使用 flatten.apply(null, arr)
或 flatten(...arr)
:
// Flatten arguments (arbitrary length) consisting of a mix of numbers and arrays
function flatten(...input) {
return input.reduce(function(prev, curr) {
return prev.concat(
Array.isArray(curr) ? flatten(...curr) : curr
);
}, []);
}
console.log(flatten(1, [2, 3], 4, [5, [6]], 7)); // should return [1, 2, 3, 4, 5, 6, 7]
以有趣的方式去做
如果将数组的数组转换为字符串,这将为您展平数组,您唯一应该做的就是将字符串数字转换为 Number
.
function flattenArgs() {
return Array.from(arguments).toString()
.split(',').map(Number);
}
console.log(flattenArgs(1, [2, 3], 4, [5, [6]], 7));
嗯,很简单。您的第一个方法已经可以处理一个数组,并且由于 arguments
基本上是一个数组,我们可以添加一个额外的行。
// Flatten an array
function flattenArray(input) {
return input.reduce(function(prev, curr) {
if (Array.isArray(curr)) {
return prev.concat(flattenArray(curr));
} else {
return prev.concat(curr);
}
}, []);
}
function flattenMix() {
return flattenArray([].slice.call(arguments));
}
console.log(flattenMix(1, [2, 3], 4, [5, [6]], 7));
好吧,你可以只使用展开运算符。
function flattenMix(...input) {
return input.reduce(function (prev, curr) {
if (Array.isArray(curr)) {
return prev.concat(flattenMix(...curr));
// ^^^^^^^
} else {
return prev.concat(curr);
}
}, []);
}
console.log(flattenMix(1, [2, 3], 4, [5, [6]], 7));
有一个新方法Array.flat()
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat