基本上,在回答与嵌套数组展平相关的SO问题之一时,我已经使用递归展平来回答问题。
var exampleArray = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]] ];
function findArrayLengths(input) {
return input.reduce((op,cur)=>{
return Array.isArray(cur) ? op.concat(findArrayLengths(cur)) : op.concat(cur)
},[])
}
let op = exampleArray.map(e=>{
return findArrayLengths(e).length
})
console.log(op);
但是我已经看到这段代码似乎也可以正常工作(具有无限深度的平面),我已经读过一些有关Array.prototype.Flat
的信息。
var arr = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]], [[1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]]] ];
let op = arr.map(e=> e.flat(Infinity).length);
console.log(op);
问题是。这样对平面进行深拉平是正确的方法吗?否则会产生后果。?
这是该问题的链接,您可以在此处https://stackoverflow.com/a/53844891/9624435
进行更多检查答案 0 :(得分:1)
这是es6方式,尽管它可以与.reduce
代替forEach一起使用
const exampleArray = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]] ];
const flatten = (items) => {
const flat = [];
items.forEach(item => {
if (Array.isArray(item)) {
flat.push(...flatten(item));
} else {
flat.push(item);
}
});
return flat;
}
const do_flat = (arr) => arr.map( (curr) => flatten(curr).length);
const output = do_flat(exampleArray);
console.log({output});
答案 1 :(得分:1)
这是对这样的平面进行深拉平的正确方法,否则会产生后果。 ?
没有后果,C:\Program Files\Python37\Lib>buildozer android debug deploy run
I Check configuration tokens
[91m[1mBuildozer is running as root![0m
[91mThis is [1mnot[0m [91mrecommended, and may lead to problems
later.[0m
Are you sure you want to continue [y/n]? y
Unknown command/target android_old
很好。仅仅是浏览器/向后兼容性的问题。
我不确定spec是否定义了如何处理传递的Array#flat(Infinity)
,因此depth
在所有浏览器中都是安全的;长话短说,它定义明确且使用安全。
但是我对您的后备代码有疑问。使用Infinity
的方式会创建很多中间(且不必要的)数组。
更好的方法是:
Array#concat()
var exampleArray = [
[1, 2, 3, 4],
[1, 2, [1, 2, 3]],
[1, 2, 3, 4, 5, [1, 2, 3, 4, [1, 2, 3, 4]]]
];
function _flatten(acc, value) {
if (Array.isArray(value)) {
return value.reduce(_flatten, acc);
}
acc.push(value);
return acc;
}
function flatten(array) {
return array.reduce(_flatten, []);
}
console.log(exampleArray.map(e => flatten(e).length));
//or since you already named your function `findArrayLength`
function _findArrayLength(count, value) {
return Array.isArray(value) ? value.reduce(_findArrayLength, count) : count + 1;
}
function findArrayLength(array) {
return array.reduce(_findArrayLength, 0);
}
console.log(exampleArray.map(findArrayLength));
或更通用的实现
.as-console-wrapper{top:0;max-height:100%!important}
var exampleArray = [
[1, 2, 3, 4],
[1, 2, [1, 2, 3]],
[1, 2, 3, 4, 5, [1, 2, 3, 4, [1, 2, 3, 4]]]
];
function reduceRecursive(fn, init) {
function _(acc, value, index, array) {
return Array.isArray(value) ? value.reduce(_, acc) : fn(acc, value, index, array);
}
return function(array){
return array.reduce(_, typeof init === "function" ? init() : init);
}
}
var flatten = reduceRecursive(function(result, value) {
result.push(value);
return result;
}, Array);
console.log(exampleArray.map(e => flatten(e).length));
var findArrayLength = reduceRecursive(function(count) {
return count + 1;
}, 0);
console.log(exampleArray.map(findArrayLength));