【问题标题】:Copy property value from matching objects between two arrays从两个数组之间的匹配对象中复制属性值
【发布时间】:2017-05-05 15:51:27
【问题描述】:

我正在使用 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/“新” JS 风格甚至 lodash 中是否有内置的东西可以得到我想要的东西。

【问题讨论】:

  • 如果数组是排序的那么这是一个简单的迭代(如果不是,那么先排序,你将无法得到更好的解决方案)。
  • 你为什么不直接做items = itemsWithQuantities
  • @Redu 我想这在技术上并不是对实际问题的回答。但是,我一直认为这在架构上可能是更好的选择。但是要直接回答你的问题……我的 itemsWithQuantities 对象与我的 items 对象“看起来”并不完全相同。只有 ID 和数量匹配。两个对象都具有其他对象不存在的独特属性。 (加上数组的长度会有所不同:items.length == 230itemsWithQuantities.length == 5)但无论如何,我想我明白你在说什么
  • 嗯,这就是为什么它是一个评论......此外,如果你想打破引用你也可以像items = itemsWithQuantities.slice();
  • 好吧,那么问题不完整.. 好吧,itemsWithQuantitiesitems 数组的所有对象都具有相同的 id,仅此而已。我的意思是数组项之间是否存在一对一的相关性?

标签: javascript arrays javascript-objects


【解决方案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

【讨论】:

    【解决方案2】:

    如果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);

    【讨论】:

      【解决方案3】:

      如果确实不能将一个数组分配给另一个数组,则可以使用内置的.map.find 方法。

      下面的示例(尽管在一天结束时,在内部,它仍在执行您提到的循环):

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

      【讨论】:

        猜你喜欢
        • 2014-08-28
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2021-02-04
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多