簡體   English   中英

以這種方式使用平面地圖是否合適?

[英]Is using flat map in such a way is proper?

基本上在回答有關嵌套數組展平的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

這是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}); 

這是一種適當的方法,可以像這樣做平坦的深度壓扁,或者有后果。

沒有消息, 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)); 
 .as-console-wrapper{top:0;max-height:100%!important} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM