用于展平多维数组的功能

时间:2014-06-25 16:26:13

标签: javascript jagged-arrays

var flatten = function (array){
  // TODO: Program me
  var newArray = [];
  for(var i = 0; i<array.length; i++) {
    newArray.push(array[i]);
  }
  return newArray;
}

这是结果除外:

flatten([1,2,3]) // => [1,2,3]
flatten([[1,2,3],["a","b","c"],[1,2,3]])  // => [1,2,3,"a","b","c",1,2,3]
flatten([[[1,2,3]]]) // => [[1,2,3]]

Test result:

Test Passed

Test Passed

Test Failed: Value is not what was expected
  1. 我在&#34;专业JS for Web Developers&#34;中寻找了一些帮助功能。但我无法找到一个用于查找数组维数的数据。

2 个答案:

答案 0 :(得分:7)

诀窍是如果输入数组的一个元素本身就是一个数组,那么你应该将元素的扁平项"concat"放入输入数组而不是推送整个数组。

这是一个使用&#34; reduce&#34;的解决方案。和#34; Array.isArray(...)&#34;仅适用于支持ECMAScript第5.1版后期规范的较新浏览器:

function flatten(array) {
  return array.reduce(function(memo, el) {
    var items = Array.isArray(el) ? flatten(el) : [el];
    return memo.concat(items);
  }, []);
}

flatten([1,2,3])                          // => [1,2,3]
flatten([[1,2,3],["a","b","c"],[1,2,3]])  // => [1,2,3,"a","b","c",1,2,3]
flatten([[[1,2,3]]])                      // => [1, 2, 3]

答案 1 :(得分:1)

以下是使用递归的一种可能解决方案:

function flatten(array, result) {
    result === undefined && (result = []);

    for (var i = 0, len = array.length; i < len; i++) {
        if (Object.prototype.toString.call(array[i]) === '[object Array]') {
            flatten(array[i], result);
        } else {
            result.push(array[i]);
        }
    }

    return result;
}

flatten([1,2,3]);
// [1, 2, 3]

flatten([[1,2,3], ["a","b","c"], [1,2,3]]);
// [1, 2, 3, "a", "b", "c", 1, 2, 3]

flatten([[[1,2,3]]]);
// [1, 2, 3]

DEMO: http://jsfiddle.net/6ZhJ6/