2017-05-05 58 views
3

我正在使用Angular 2/Typescript。從兩個數組之間的匹配對象複製屬性值

我有「項目」的數組:

items: [ 
    { 
    "id": 1, 
    "qty" undefined 
    }, 
    { 
    "id": 2, 
    "qty" undefined 
    } 
    { 
    "id": 3, 
    "qty" undefined 
    }...etc 
] 

然後,我有「ItemsWithQuantities」的數組:

itemsWithQuantities: [ 
     { 
     "id": 1, 
     "qty" 55 
     }, 
     { 
     "id": 2, 
     "qty" 3 
     } ...etc 
    ] 

我希望把數量值從itemsWithQuantities陣列成在items數組中匹配(由id)對象的qty屬性。很明顯,我可以創建一個循環和嵌套循環來找到一個匹配並設置屬性值,但我更感興趣的是重構/雄辯的解決方案。我想知道是否有內置的打字稿/「新」JS風味,甚至lodash,可以得到我想要的。

+0

如果數組進行排序,然後它是一個簡單的迭代(如果不是,那麼排序他們首先,你將無法獲得更好的解決方案)。 –

+1

爲什麼你不只是'items = itemsWithQuantities'? – Redu

+0

@Redu我想這在技術上不是對實際問題的回答。但是,我一直認爲這在架構上可能是更好的東西。 但直接回答你的問題...我的itemsWithQuantities對象不「看」完全一樣的我的項目對象。只有一個ID和一個數量匹配。兩個對象都具有其他對象上不存在的唯一屬性。 (加上數組的長度將是不同的:'items.length == 230'而'itemsWithQuantities.length == 5')但是無論如何,我想我明白你在說什麼 – JzInqXc9Dg

回答

1

您可以使用lodash merge

var items = [ 
 
     { 
 
     "id": 1, 
 
     "qty": undefined 
 
     }, 
 
     { 
 
     "id": 2, 
 
     "qty": undefined 
 
     }, 
 
     { 
 
     "id": 3, 
 
     "qty": undefined 
 
     } 
 
    ]; 
 
    
 
    var itemsWithQuantities = [ 
 
      { 
 
      "id": 1, 
 
      "qty": 55 
 
      }, 
 
      { 
 
      "id": 2, 
 
      "qty": 3 
 
      }, 
 
      { 
 
      \t "id": 3, 
 
      "qty": 24 
 
      } 
 
    ]; 
 
     
 
    var answer = _.merge(itemsWithQuantities, items); 
 
    console.log(answer);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.5.1/lodash.min.js"></script>

jsfiddle

0

如果itemsitemsWithQuantity陣列的所有項目相關的一對一,那麼你可能根本就喜歡;

var items = [{"id": 1,"qty": undefined, "x": "something"}, {"id": 2,"qty": undefined, "x":"another thing"}, {"id": 3,"qty": undefined, "x": "whatever"}], 
 
itemsWithQty = [{"id": 1,"qty": 3}, {"id": 2,"qty": 7}, {"id": 3,"qty": 4}], 
 
result  = items.map((o,i) => Object.assign({},o,itemsWithQty[i])); 
 

 
console.log(result);

0

如果它確實是不是你可以只指定一個陣列到另一個的情況下,那麼你可以使用內置的.map.find方法。

下面

例子(儘管在一天結束的時候,在內部,它仍然在做你所提到的環):

const res = items 
    .map(item => Object.assign({}, item,{qty:(itemsWithQuantities.find(iwq => iwq.id === item.id) || {qty:0}).qty})); 
相關問題