将数组与前一个数组项连接起来

时间:2014-05-27 22:41:46

标签: javascript arrays concat

我想获取一个数组数组,并将下一个项与数组中的最后一个数组连接。

var array = [
  ["thomas"], 
  ["jane"],
  ["harry"],
]

array = processArray(array);

console.log(array);

[
  ["thomas"],
  ["thomas", "jane"],
  ["thomas", "jane", "harry"],
]

这是一个很好的方法吗?在我深入研究它之前,我想知道是否有一种使用下划线的简单方法。

var processArray = function(grouped){
  var prev = false;
  var map = _.map(grouped, function(value, key) {
    if (prev) value.concat(grouped[prev]);
    prev = key;
    var temp = {};
    temp[key] = value;
    return temp;
  });
  return _.extend.apply(null, map);
}

3 个答案:

答案 0 :(得分:1)

鉴于此

var array = [
  ["thomas"], 
  ["jane"],
  ["harry"],
]

你可以简单地做

var A=[];
array = array.map(function(o,i){
    return A.concat.apply(A, array.slice(0,i+1))
});

有关concat使用的详细信息,请参阅this SO post

答案 1 :(得分:0)

一种简单的方法是使用map和slice在每个返回中创建新数组:

 [
  ["thomas"], 
  ["jane"],
  ["harry"],
]
.map(function(a){return a[0];})  // flatten sub-array to just primitive value
.map(function(a,b,c){return c.slice(0,b+1)}); // slice all primitive values by position

/* == 
[
  ["thomas"],
  ["thomas", "jane"],
  ["thomas", "jane", "harry"],
]
*/

编辑:

Nit显示了一个很好的应用来结合我的第一步和第二步。像我的代码一样使用内联的模式看起来像这样(再次,感谢nit):

[
  ["thomas"], 
  ["jane"],
  ["harry"],
].map(function(o,i,a){
    return this.concat.apply(this, a.slice(0,i+1));
}, []);

我真的很喜欢这个版本(到目前为止):它有效,是一行,没有变量或闭包,并且可以巧妙地使用内置函数。

答案 2 :(得分:0)

您正在寻找的似乎是更一般reductions的特定情况,它会返回reduce的中间结果。 original Clojure version可以在JavaScript中重新实现:

function reductions(xs, f, init) {
  if(typeof(init) === "undefined") {
    return reductions(_.rest(xs), f, _.first(xs))
  }
  if(xs.length === 0) return [init]

  var y = f(init, _.first(xs))
  return [init].concat(reductions(_.rest(xs), f, y))
}

就像JavaScript’s own reduce一样使用:

var array = ["thomas", "jane", "harry"]
reductions(array, function(xs, x) { return xs.concat(x) }, [])
//=> [[] ["thomas"], ["thomas", "jane"], ["thomas", "jane", "harry"]]

当然,您可以使用_.rest轻松删除最初的[]