2015-08-13 23 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