在JavaScript中展平嵌套数组

时间:2016-12-26 11:41:17

标签: javascript arrays

我有一个可怕的数组,看起来像这样:

编辑:

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:请参阅上面的实际数组,感谢您向我展示如何看到这个!

8 个答案:

答案 0 :(得分:9)

如果您有lodash,则可以使用:

_.flattenDeep(array)

如果您愿意,也可以结帐their source code了解如何实施自己的想法。

答案 1 :(得分:8)

您可以使用将返回新数组的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))

reduce()

正如 @Bergi 建议你可以像这样使用data.reduce((r, e) => r.concat(Array.isArray(e) ? flat(e) : [e]), [])

  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]

答案 2 :(得分:8)

编辑嵌套数组/对象的新请求和展平,您可以使用组合方法测试元素的类型。



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);




答案 3 :(得分:2)

您可以在flatten中尝试Ramda功能。

$json = '{"opt905217":"Option 1","opt2347462":"Option 2","opt905265":"Option 3","opt906845":"Option 4",}';

$obj = json_decode($json);
print $obj->{'opt905217'}; // Option 1

答案 4 :(得分:2)

在这种情况下使用递归函数很不错:



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));
&#13;
&#13;
&#13;

答案 5 :(得分:1)

您的数组格式不正确,您缺少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);

答案 6 :(得分:1)

没有人想过就地拼接?

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;
}

一次迭代,没有递归。

答案 7 :(得分:0)

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]]]]);