2013-06-12 74 views
2

我有一個數組,其中有幾個類別對象,每個對象都有一個items屬性,其中包含一個項目對象數組。我想將每個類別中的每個項目映射到具有屬性值和標籤的對象[]。出於某種原因,我無法執行連接。映射後連接嵌套陣列

var categories = [{ 
       name: "category1", 
       items: [{ 
        itemId: 1, 
        name: "Item1" 
       }, { 
        itemId: 2, 
        name: "Item2" 
       }] 
      }, { 
       name: "category2", 
       items: [{ 
        itemId: 3, 
        name: "Item3" 
       }, { 
        itemId: 4, 
        name: "Item4" 
       }] 
      }]; 

var items = []; 
for(var i = 0; i < categories.length; i++){ 
    items.concat($.map(categories[i].items,function(elem){ 
     return {value:elem.itemId, label:elem.name}; 
    })); 
} 
console.log(items); //prints [] 

預期結果

[{ 
    label: "Item1", 
    value: "1" 
}, 
{ 
    label: "Item2", 
    value: "2" 
},{ 
    label: "Item3", 
    value: "3" 
},{ 
    label: "Item4", 
    value: "4" 
} 

我覺得,如果我失去了一些東西非常基本的。我記錄了$.map函數的結果,它似乎返回[]。任何人都可以找出問題嗎?

的jsfiddle:http://jsfiddle.net/vymJv/

+0

請忽略。我需要分配項目的結果concat() –

回答

5

的concat()方法被用於連接兩個或更多個陣列。

此方法不會更改現有數組,但返回包含連接數組值的新數組 。

http://jsfiddle.net/vymJv/1/

for(var i = 0; i < categories.length; i++){ 

items = items.concat($.map(categories[i].items,function(elem){ 
     return {value:elem.itemId, label:elem.name}; 
    })); 
} 
+0

感謝您的答案,我發佈後不久我意識到這一點。我想我需要把它擺平。我會接受幾個。 –

10

使用直的Javascript的另一種方法:

var x = categories.map(function(val) { 
    return val.items; 
}).reduce(function(pre, cur) { 
    return pre.concat(cur); 
}).map(function(e,i) { 
    return {label:e.name,value:e.itemId}; 
}); 

輸出:x = [{label: "Item1", value: 1}, {label: "Item2", value: 2}, …]

2

我們可以通過創建concatAll將串聯所有的擴展陣列原型你的數組通過ite評估每個子陣列,將每個值轉儲到新陣列中。每個類別轉換成項目的數組

let items = categories.map(function(category) { 
    return category.items.map(function(item) { 
    return {label: item.name, value: item.itemId}; 
    }); 
}).concatAll(); 

我們拿到的項目:

Array.prototype.concatAll = function() { 
    var results = []; 
    this.forEach(function(subArray) { 
    subArray.forEach(function(subArrayValue) { 
     results.push(subArrayValue); 
    }); 
    }); 
    return results; 
}; 

然後,我們可以用下面的獲得所需的結果。因爲我們有兩個類別,我們最終會得到兩個項目數組。通過對最終結果應用concatAll,我們將這兩個項目數組進行平展並獲得所需的輸出。

0

這段代碼解決了使用功能的編程方法你的任務:

var items = [].concat.apply([], categories.map(cat => 
    cat.items.map(elem => ({ value:elem.itemId, label:elem.name }))) 
) 

說明:Function.prototype.apply()有語法fun.apply(thisArg, [argsArray]),讓我們能夠在一個數組的函數提供的參數。 Array.prototype.concat()將任意數量的參數組合成一個數組。如果我們現在寫Array.prototype.concat.apply([], [category1Items, ..., categoryNItems]),它實際上等於[].concat(category1Items, ..., categoryNItems),它將所有參數連接在一起。您也可以用[].concat代替Array.prototype.concat以縮短它。否則,我們只是使用標準映射來完成工作。

你也可以裂開碼多一點的清晰:

function getItem(elem){ 
    return {value:elem.itemId, label:elem.name}; 
} 

function getCategoryItems(cat) { 
    return cat.items.map(getItem); 
} 

function flatten(arr) { 
    return Array.prototype.concat.apply([], arr); 
} 

var items = flatten(categories.map(getCategoryItems));