2017-05-05 66 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})); 
相关问题