我想获取一个数组数组,并将下一个项与数组中的最后一个数组连接。
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);
}
答案 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
轻松删除最初的[]
。