2017-07-28 48 views
0

我想創建一個地圖>類型腳本中有類似ID的對象列表,但我沒有得到正確的方法。我知道,在這種情況下可行,但無法實現。這是我曾嘗試創建一個新的地圖類似的ID在對象類型的對象數組

讓我們說我有顏色的列表,像這樣:

[ 
    { 
     "Id": "1", 
     "color": "red", 
     "ref": "tr" 
    }, 
    { 
     "Id": "1", 
     "color": "blue", 
     "ref": "gt", 
    }, 
    { 
     "Id": "2", 
     "color": "red", 
     "ref": "tt" 
    }, 
] 

我試圖構建一個地圖,像這樣

[ 
    1: [ 
     { 
     "Id": "1", 
     "color": "red", 
     "ref": "tr" 
     }, 
     { 
     "Id": "1", 
     "color": "blue", 
     "ref": "gt", 
     } 
    ], 
    2: [ 
     { 
     "Id": "2", 
     "color": "red", 
     "ref": "tt" 
     } 
    ] 
] 

這是我試過到目前爲止:

const colorsMap: Map<string, Array<Color>> = new Map<string, Array<Color>>(); 
let colorLists: Array<Color> = []; 
colors.forEach(function (value, i) { 
      if (value[i - 1]) { 
       if (colors[i - 1].id=== value.gblId) { 
        const color = new Color(value.styleId, value.color, value.ref); 
        colorLists.push(gblRowValue); 
       } else { 
        const color = new Color(value.styleId, value.color, value.ref); 
        colorLists= new Array<Color>(); 
        colorLists.push(color); 
       } 
      } 
      colorsMap.set(value.id, colorLists); 
     }); 

結果是每個陣列我只得到一個值:

[ 
     1: [ 
      { 
      "Id": "1", 
      "color": "blue", 
      "ref": "gt", 
      } 
     ], 
     2: [ 
      { 
      "Id": "2", 
      "color": "red", 
      "ref": "tt" 
      } 
     ] 
    ] 

回答

0

在情況下,你可以使用ES6的功能,你可以使用下面的小片段,不需要龐大的lodash庫:

let colors = [ 
 
    { 
 
     "Id": "1", 
 
     "color": "red", 
 
     "ref": "tr" 
 
    }, 
 
    { 
 
     "Id": "1", 
 
     "color": "blue", 
 
     "ref": "gt", 
 
    }, 
 
    { 
 
     "Id": "2", 
 
     "color": "red", 
 
     "ref": "tt" 
 
    }, 
 
]; 
 
    
 
let orderedColors = colors.reduce((returnArray, color) => { 
 
    if(!returnArray[color.Id]){ 
 
     returnArray[color.Id] = []; 
 
    } 
 
    returnArray[color.Id].push(color); 
 
    return returnArray; 
 
},[]);

+0

值得指出的是,如果您不想導入整個庫,則可以導入各個lodash函數。 –

+0

@GruffBunny仍然傾向於使用「本機」es6而不是導入某些庫代碼,對;) –

+0

如果它是像'_.groupBy(data,'Id');':)這樣的一行代碼,則不行; –

0

array.forEach提供了回調的三個參數。

currentValue

當前元素的值的數組中的正在處理中。

index

當前元素的索引陣列中的正在處理中。

array

的陣列的forEach()被施加到。

您使用valuei,這是currentValueindex

所以if (value[i - 1]) {意味着if (currentValue[index - 1]) {這對我沒有多大意義。

我想你只是想使用currentValue,就像這樣。

interface Color { 
    Id: string; 
    color: string; 
    ref: string; 
}; 

let colors: Color[] = [{ 
    "Id": "1", 
    "color": "red", 
    "ref": "tr" 
}, 
{ 
    "Id": "1", 
    "color": "blue", 
    "ref": "gt", 
}, 
{ 
    "Id": "2", 
    "color": "red", 
    "ref": "tt" 
}]; 

let colorMap = new Map<string, Color[]>(); 

colors.forEach((color) => { 
    let colorsArray = colorMap.get(color.Id) || []; 
    colorsArray.push(color); 

    colorMap.set(color.Id, colorsArray) 
}); 

let colorId1Index0 = colorMap.get("1")[0]; 
let colorId1Index1 = colorMap.get("1")[1]; 
let colorId2Index0 = colorMap.get("2")[0]; 

console.log(`${colorId1Index0.color} ${colorId1Index0.ref}`); 
console.log(`${colorId1Index1.color} ${colorId1Index1.ref}`); 
console.log(`${colorId2Index0.color} ${colorId2Index0.ref}`); 

控制檯日誌:

red tr 
blue gt 
red tt 

這裏是它的工作的TypeScript Playground

0

您可以使用lodash的_.groupBy()取得這一結果:

const data = [{"Id":"1","color":"red","ref":"tr"},{"Id":"1","color":"blue","ref":"gt"},{"Id":"2","color":"red","ref":"tt"}]; 
 

 
const result = _.groupBy(data, 'Id'); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

相關問題