从JS Object重新分配属性值到另一个

时间:2017-03-06 21:02:12

标签: javascript json

我正在尝试从JSON A到JSON B为我的物品分配价格,设法获得价格并将其重新分配给物业但不是整个物品。

这是我的代码片段,它从第一个Object获取价格并将其重新分配给JSON.stringify但是如何将其推回TotalOrignialValue对象?

有没有更令人愉快的方法来实现这一目标?

newJson

3 个答案:

答案 0 :(得分:0)

看起来您从JSON A到JSON B的唯一连接是项目上的代码数组。

您可以循环遍历JSON a中的条目,通过检查代码值在JSON B中找到相应的项目,并直接在JSON B条目上分配值

var items = {
    "TransactionLine": [
      {
        "Product": {
          "Id": null,
          "Codes": [
            "1112"
          ],
          "Sku": null
        },
        "TotalValue": 2.35,
      },
      {
        "Product": {
          "Id": null,
          "Codes": [
            "1113"
          ],
          "Sku": null
        },
        "TotalValue": 2.15,
      }
    ],
    "CustomData": {}
  };

var newJson = {
    "OrderLines": [
          {
            "Product": {
              "Id": 9,
              "Codes": [
                "1113"
              ],
              "Sku": "CS1113"
            },
            "TotalOriginalValue": 0, // asign the price here
          },
          {
            "Product": {
              "Id": 21,
              "Codes": [
                "1112"
              ],
              "Sku": "CS1112"
            },
            "TotalOriginalValue": 0, // asign the price here
          }
        ]
  };
  
items.TransactionLine.forEach(item=>{
    var match = newJson.OrderLines.find(entry=>entry.Product.Codes[0] === item.Product.Codes[0]);
    if (!match) { 
        return;
    }
    match.TotalOriginalValue = item.TotalValue;
});
console.log(newJson);

这也将删除数组的使用和JSON项的循环。 在2的列表上它不是那么糟糕,但加上几百/千,它会变得明显。

答案 1 :(得分:0)

使用Lodash让您的生活变得更加轻松,使用lodash可以提供您所需要的东西,可能还有一种更为简洁的方法。使用Lodash。

var items = {
    "TransactionLine": [
      {
        "Product": {
          "Id": null,
          "Codes": [
            "1112"
          ],
          "Sku": null
        },
        "TotalValue": 2.35,
      },
      {
        "Product": {
          "Id": null,
          "Codes": [
            "1113"
          ],
          "Sku": null
        },
        "TotalValue": 2.15,
      }
    ],
    "CustomData": {}
  };



  var newJson = {
    "OrderLines": [
          {
            "Product": {
              "Id": 9,
              "Codes": [
                "1113"
              ],
              "Sku": "CS1113"
            },
            "TotalOriginalValue": 0, // asign the price here
          },
          {
            "Product": {
              "Id": 21,
              "Codes": [
                "1112"
              ],
              "Sku": "CS1112"
            },
            "TotalOriginalValue": 0, // asign the price here
          }
        ]
  };

var test = _.map(items.TransactionLine, (item,index) => {
return _.set(newJson.OrderLines[index], 'TotalOriginalValue', item.TotalValue)
})

console.log(test)

https://jsfiddle.net/k6vdyhx7/124/

答案 2 :(得分:0)

迭代OrderLines键值,这是一个数组,然后用TotalOriginalValue数组中的响应值替换每个items.TransactionLine值。

var items = {TransactionLine:[{Product:{Id:null,Codes:["1112"],Sku:null},TotalValue:2.35},{Product:{Id:null,Codes:["1113"],Sku:null},TotalValue:2.15}],CustomData:{}},
    newJson = {OrderLines:[{Product:{Id:9,Codes:["1113"],Sku:"CS1113"},TotalOriginalValue:0},{Product:{Id:21,Codes:["1112"],Sku:"CS1112"},TotalOriginalValue:0}]};
 
    newJson.OrderLines.forEach((v,i) => v.TotalOriginalValue = items.TransactionLine[i].TotalValue);
    console.log(newJson);