簡體   English   中英

在 JavaScript 中展平嵌套數組

[英]Flattening nested array in JavaScript

我有一個看起來很可怕的數組,看起來像這樣:

編輯:

array = [
    {
        Letters: [{ Letter: 'A' }, { Letter: 'B' }, { Letter: 'C' }],
        Numbers: [{ Number: '1' }, { Number: '2' }, { Number: '3' }]
    },
    null,
    {
        Letters: [{ Letter: 'D' }, { Letter: 'E' }, { Letter: 'F' }, { Letter: 'G' }, { Letter: 'H' }],
        Numbers: [{ Number: '4' }, { Number: '5' }, { Number: '6' }, { Number: '7' }]
    }
];

並希望數組看起來像這樣:

flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7]

不幸的是,我無法更改原始格式,因為這是合並我得到的兩個 API 響應時收到的表單。

我試過使用:

var flattenedArray = [].concat.apply([], array);

但它只是以與輸入相同的格式顯示數組。

我想知道是否有人有任何建議?

編輯:我已經嘗試實施給出的建議 - 非常感謝您的幫助。 似乎這是列表格式的問題 - 不幸的是,使用“樹”格式的 chrome 控制台我看不到數組輸出的直接結構。

謝謝你的幫助! 編輯 2:請參閱上面的實際數組,感謝您向我展示如何查看此內容!

如果你有lodash ,你可以使用:

_.flattenDeep(array)

如果您願意,您還可以查看有關如何實現自己的ide 的源代碼

您可以使用將返回新數組的forEach()創建遞歸函數。

 var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]] function flat(data) { var r = [] data.forEach(e => Array.isArray(e) ? r = r.concat(flat(e)) : r.push(e)); return r; } console.log(flat(array)) 

您也可以使用reduce()而不是forEach()

 var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]] function flat(data) { return data.reduce((r, e) => Array.isArray(e) ? r = r.concat(flat(e)) : r.push(e) && r, []) } console.log(flat(array)) 

正如@Bergi建議你可以像這樣使用reduce()

data.reduce((r, e) => r.concat(Array.isArray(e) ? flat(e) : [e]), [])

編輯嵌套數組/對象的新請求和展平,您可以使用組合方法測試元素的類型。

 var array = [{ Letters: [{ Letter: 'A' }, { Letter: 'B' }, { Letter: 'C' }], Numbers: [{ Number: '1' }, { Number: '2' }, { Number: '3' }] }, null, { Letters: [{ Letter: 'D' }, { Letter: 'E' }, { Letter: 'F' }, { Letter: 'G' }, { Letter: 'H' }], Numbers: [{ Number: '4' }, { Number: '5' }, { Number: '6' }, { Number: '7' }] }], result = array.reduce(function iter(r, a) { if (a === null) { return r; } if (Array.isArray(a)) { return a.reduce(iter, r); } if (typeof a === 'object') { return Object.keys(a).map(k => a[k]).reduce(iter, r); } return r.concat(a); }, []); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

舊請求和不朽的問題如何平展嵌套數組。

 var flat = (r, a) => Array.isArray(a) ? a.reduce(flat, r) : r.concat(a), inputArray = array = [[['a', 'b', 'c'], [1, 2, 3]], [], [['d', 'e', 'f', 'g', 'h'], [4, 5, 6, 7]]], outputArray = inputArray.reduce(flat, []); console.log(outputArray); 

您可以嘗試Ramda中flatten功能。

  R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
    //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

在這種情況下使用遞歸函數很好:

 arr = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]]; function flatten(arr) { var result = []; for (var i = 0, len = arr.length; i < len; i++) { result = result.concat(Array.isArray(arr[i])? flatten(arr[i]) : [arr[i]]); } return result; } console.log(flatten(arr)); 

您的數組格式不正確,您缺少commas(,) 這是正確的數組。

var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]];

 var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]]; var result = flatten(array); function flatten(array) { var flat = []; if(array !== undefined){ var flat = []; for (var i = 0; i < arguments.length; i++) { if (arguments[i] instanceof Array) { flat = flat.concat(flatten.apply(null, arguments[i])); } else { flat.push(arguments[i]); } } } return flat; } console.log(result); 

沒人想到就地拼接?

function flatten(array){
    for (var i = 0; i < array.length; i++) {
        if(array[i] instanceof Array){
            array.splice.apply(array,[i,1].concat(array[i]));
            i--;
        }
    };
    return array;
}

一次迭代,沒有遞歸。

function steamrollArray(arr) {
  var tmp = [];
  arr.forEach(function(val){
    if(Array.isArray(val))
      tmp = tmp.concat(steamrollArray(val));
    else
      tmp.push(val);
  });

  console.log(tmp);
  return tmp;
}

steamrollArray([1, [2], [3, [[4]]]]);
let arr = [1,2,[3,4]]

/* let newarr = arr.flat(); */

let newarr = Object.values(arr);
let arr2 = []
for(let val of Object.values(arr)) {
         if(!Array.isArray(val)){
     console.log(val)
     arr2.push(val)
     }    
           for ( let val2 of Object.values(val)){
             arr2.push(val2)
           }
}
console.log(arr2)

使用遞歸和擴展運算符實現展平功能。

暫無
暫無

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

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