【问题标题】:Add property to object in nested objects向嵌套对象中的对象添加属性
【发布时间】:2018-03-03 19:15:44
【问题描述】:

我有一个包含对象的数组,例如:

data1 = [
{
    "name": "Name-A",
    "image": "images/a.png",
    "prices": [
        {
            "name": "c1",
            "buy": "10",
            "sell": "11"
        },
        {
            "name": "c2",
            "buy": "16",
            "sell": "15"
        }
    ]
},
{
    "name": "Name-B",
    "image": "images/b.png",
    "prices": [
        {
            "name": "c1",
            "buy": 11,
            "sell": 12
        }
    ]
},
{
    "name": "Name-C",
    "image": "images/c.png",
    "prices": [
        {
            "name": "c3",
            "buy": 123,
            "sell": 124
        }
    ]
}]

在这里,我想根据存储在其他 API 链接中的排名将排名添加到特定名称,例如:

data2=[{
    "name": "cs1",
    "symbol": "C1",
    "id": 1
},
{
    "name": "cs2",
    "symbol": "C2",
    "rank": 2,
    "id": 1027
},
 {...}, 
 {...}
 ....]

所以结果数组应该是这样的,

[ {
    "name": "Name-A",
    "image": "images/a.png",
    "prices": [
        {
            "name": "c1",
            "rank": 1,
            "buy": "10",
            "sell": "11"
        },
        {
            "name": "c2",
            "rank": 2,
            "buy": "16",
            "sell": "15"
        }
    ]
},
{
    "name": "Name-B",
    "image": "images/b.png",
    "prices": [
        {
            "name": "c1",
            "rank": 1,
            "buy": 11,
            "sell": 12
        }
    ]
},
{
    "name": "Name-C",
    "image": "images/c.png",
    "prices": [
        {
            "name": "c3",
            "rank": 3,
            "buy": 123,
            "sell": 124
        }
    ]
}]

我需要比较前两个对象数组并需要在第三个数组中获取rank。 前两个数组分别与前两个数组的namesymbol 进行比较。 我曾尝试在 javascript 中使用map,但结果数组在所有对象中都包含相同的rank,可能是最后一个对象的排名。

我的代码:

{
 data1.map((cd)=>{
 cd.prices.map((p)=>{
  data2.map((r)=>{
   if(r.symbol.toUpperCase() === p.name.toUpperCase()){
     cd.prices.forEach(function(cs){
     cs.rank = r.rank;
  });
  }
})

}) }

如何做到这一点,以便我得到其中包含排名的对象的结果数组?我被这个困住了。

【问题讨论】:

    标签: javascript arrays json ecmascript-6 javascript-objects


    【解决方案1】:

    您可以使用forEach 循环,使用map 来避免data1.prices 修改和find 查找具有rank 值的特定对象。

    var data1 = [{    "name": "Name-A",    "image": "images/a.png",    "prices": [        {            "name": "c1",            "buy": "10",            "sell": "11"        },        {            "name": "c2",            "buy": "16",            "sell": "15"        }    ]},{    "name": "Name-B",    "image": "images/b.png",    "prices": [        {            "name": "c1",            "buy": 11,            "sell": 12        }    ]},{    "name": "Name-C",    "image": "images/c.png",    "prices": [        {            "name": "c3",            "buy": 123,            "sell": 124        }    ]}];
    var data2=[{    "name": "cs1",    "symbol": "C1",    "rank": 1,    "id": 1},{    "name": "cs2",    "symbol": "C2",    "rank": 2,    "id": 1027},{    "name": "cs3",    "symbol": "C3",    "rank": 3,    "id": 10276}];
    
    var result = data1.map((o) => {
        // This is to avoid data1 modification.
      var newObj = { ...o, prices: o.prices.map((pp) => ({...pp})) }; 
      
      newObj.prices.forEach((p) => {
        var found = data2.find((d) => d.symbol.toUpperCase() === p.name.toUpperCase());
        if (found) p.rank = found.rank;
      });
      
      return newObj;
    });
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多