2015-08-13 19 views
0

$scope.data = [[1,2,3], [1,5,6,7], [2,3]];拼合数组,并保持指数作为其位置

价值,我会用 _.flatten($scope.data)所以scope.data会像

$scope.data = [1,2,3,1,5,6,7,2,3];

但我想保持的索引在每个元素被夷为平地的阵列

所以我会有这样的事情:

$scope.data = [{value:1, index:1}, 
        {value:2, index:1}, 
        {value:3, index:1}, 
        {value:1, index:2}, 
        {value:5, index:2}, 
        {value:6, index:2}, 
        {value:7, index:2}, 
        {value:2, index:3} 
        {value:3, index:3}]; 

回答

2

你可以通过原有的阵列,像这样的循环:

function flatten(arr) 
{ 
    var returnArray = new Array(); 
    for(var i = 0; i < arr.length; i++) 
    { 
     for(var j = 0; j < arr[i].length; j++) 
     { 
      returnArray.push({"value" : arr[i][j], "index" : i}); 
     } 
    } 
    return returnArray; 
} 

输出:

enter image description here

+0

这就是我想要的,所以谢谢你的回复:)但它会增加我所拥有的更多复杂性,没有其他方法可以做到这一点?像在一行中?如果我错过了一些不错的库,可以这样做 – unpix

+0

@unpix一行是这样的:'var array = flatten(oldArray);';)只需将函数存储在一个JavaScript文件中,并在一行中调用它。您可以将“复杂”代码隐藏在页面链接的JavaScript文件中。 – brso05

+0

我给它+1,所以在某些库中没有任何功能可以和这段代码做同样的事情吗? – unpix

0

可以在纯功能性的方式做到这一点:

var data = [[1,2,3], [1,5,6,7], [2,3]]; 

    function flat(arr){ 
    return arr.reduce(function(result, current, index){ 
     return result.concat(current.map(function(elm){ 
     return {value: elm, index: index + 1} 
     })) 
    }, []); 
    } 

console.log(flat(data)); 
+0

你需要索引+ 1.干杯! – potatopeelings

+0

我通常从0开始,但它不是很难改变它^^ –

1
var input = [[1, 2, 3], [1, 5, 6, 7], [2, 3]], 
    output; 

output = Array.prototype.concat.apply([], input.map(function(arr, idx) { 
     return arr.map(function(el) { 
      return { "value": el, "index": (idx + 1) }; 
     }); 
    }) 
); 

console.log(JSON.stringify(output)); 
// [{"value":1,"index":1},{"value":2,"index":1},{"value":3,"index":1},{"value":1,"index":2},{"value":5,"index":2},{"value":6,"index":2},{"value":7,"index":2},{"value":2,"index":3},{"value":3,"index":3}] 

fiddle