在两个数组之间匹配对象并复制属性值

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数组中的qty值放入items数组中匹配(通过id)的对象的qty属性中。显然,我可以创建一个循环和嵌套循环来找到匹配并设置属性值,但我更感兴趣的是一种重构/简洁的解决方案。我想知道在typescript/"new" JS flavors甚至lodash中是否有内置的东西可以帮我实现这个目标。


如果数组已经排序,那么这只是一个简单的迭代(如果没有排序,则先对其进行排序,你将得不到更好的解决方案)。 - Nitzan Tomer
1
为什么不直接将 items = itemsWithQuantities 呢? - Redu
@Redu 我想这从技术上讲并不是对实际问题的回答。但是,我一直在思考这可能在架构上是更好的选择。但是为了直接回答你的问题...我的itemsWithQuantities对象与我的items对象不完全相同。只有ID和qty匹配。两个对象都有独特的属性,另一个对象上不存在。(而且数组的长度将不同:items.length == 230itemsWithQuantities.length == 5)但无论如何,我认为我理解你的意思。 - default_noob_network
1
这就是为什么它是一个注释的原因...此外,如果您想要打破引用,您也可以这样做:items = itemsWithQuantities.slice(); - Redu
好的,那么问题并不完整。itemsWithQuantities 是否包含 items 数组中所有具有相同 ID 的对象,且没有其他对象?这意味着数组 items 中是否存在一对一的关系? - Redu
3个回答

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
          },
          {
           "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

的英译为:

{{链接1: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}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接