ikemonn's blog

技術ネタをちょこちょこと

【Underscore.js】_.flattenを読んだ

jashkenas/underscore_.flattenを読んだ。

概要

_.flatten(array, [shallow])

入れ子になっている配列を、一次元の配列に変換する。 shallowがtrueの時は、一つだけ入れ子をなくす。

list = [1, 10, 7, [190, 43], [[1]]];
var x = _.flatten(list);
console.log(x); // [1, 10, 7, 190, 43, 1]

ソースコード

 var flatten = function(input, shallow, strict, startIndex) {
    var output = [], idx = 0;
    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        //flatten current level of array or arguments object
        if (!shallow) value = flatten(value, shallow, strict);
        var j = 0, len = value.length;
        output.length += len;
        while (j < len) {
          output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false);
  }

shallowを指定しない場合は、下記のコードで再帰的に入れ子を1つずつなくしていっている。

if (!shallow) value = flatten(value, shallow, strict);

参考

jashkenas/underscore