【问题标题】:How to Merge two array with different key but same value in Javascript? [closed]如何在Javascript中合并两个具有不同键但相同值的数组? [关闭]
【发布时间】:2021-04-20 08:38:23
【问题描述】:

我有两个对象,我试图用不同的键合并第一个对象我需要与 Id 进行比较,第二个对象我需要与 Option 进行比较。

我在下面提到了我的最终预期输出

向我的错误格式道歉。我是这个论坛的新手。请帮忙。

提前致谢。

我的第一个对象

[
  {
    Category__c: "Option",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcGEAS",
    Name: "with door"
  },
  {
    Category__c: "Upgrade",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcHEAS",
    Name: "Upgrade"
  },
  {
    Category__c: "New Option",
    Description__c: "1300 wide with doors",
    Id: "a0F1e000000EgcIEAS",
    Name: "doors"
  },
  {
    Category__c: "Oven",
    Description:"1450 Door",
    Id: "a0F1e000000EgcJEAS",
    Name: "Oven Option: Wall Oven"
  }
]

我的第二个对象

[
  {
    Option: "a0F1e000000EgcJEAS",
    Price: 0
  }
]

现在我的预期输出是

[
  {
    Category__c: "Option",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcGEAS",
    Name: "with door"
  },
  {
    Category__c: "Upgrade",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcHEAS",
    Name: "Upgrade"
  },
  {
    Category__c: "New Option",
    Description__c: "1300 wide with doors",
    Id: "a0F1e000000EgcIEAS",
    Name: "doors"
  },
  {
    Category__c: "Oven",
    Description:"1450 Door",
    Id: "a0F1e000000EgcJEAS",
    Price: 0,
    Name: "Oven Option: Wall Oven"
  }
]

【问题讨论】:

    标签: javascript arrays json


    【解决方案1】:

    最好不要改变原始对象,而是在新对象中进行更改。

    const data = [
      {
        Category__c: "Option",
        Description__c: "Exdoor",
        Id: "a0F1e000000EgcGEAS",
        Name: "with door",
      },
      {
        Category__c: "Upgrade",
        Description__c: "Exdoor",
        Id: "a0F1e000000EgcHEAS",
        Name: "Upgrade",
      },
      {
        Category__c: "New Option",
        Description__c: "1300 wide with doors",
        Id: "a0F1e000000EgcIEAS",
        Name: "doors",
      },
      {
        Category__c: "Oven",
        Description: "1450 Door",
        Id: "a0F1e000000EgcJEAS",
        Name: "Oven Option: Wall Oven",
      },
    ];
    
    const selected = [
      {
        Option: "a0F1e000000EgcJEAS",
        Price: 0,
      },
    ];
    
    const result = data.map((obj) => {
      const searchObj = selected.find(({ Option, Price }) => Option === obj.Id);
      if (searchObj) return { ...obj, Price: searchObj.Price };
      return obj;
    });
    
    console.log(result);

    【讨论】:

    • decpk const Selected 也是一个数组而不是单个对象
    • 好吧,让我改一下答案
    • 你只是复制了我的答案并更改为地图..
    • 请告诉我先生该怎么做我真的是新来的先生 Ran Turner
    • 是的,@decpk 先生,非常感谢您的快速回复。
    【解决方案2】:

    您可以使用 Array.prototype.forEach() 为每个数组元素执行一次提供的函数。

    在 forEach 中,我们将检查当前 data.id 是否等于所选选项。如果是这样,我们将使用点符号将其价格添加到数据中。

    已编辑:我将代码更新为灰色 123 请求,并将选择更改为数组和他的请求

    const data = [
    {
    Category__c: "Option",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcGEAS",
    Name: "with door"
    
    },
    {
     Category__c: "Upgrade",
    Description__c: "Exdoor",
    Id: "a0F1e000000EgcHEAS",
    Name: "Upgrade"
    
    },
    {
    Category__c: "New Option",
    Description__c: "1300 wide with doors",
    Id: "a0F1e000000EgcIEAS",
    Name: "doors"
    },
    {
    Category__c: "Oven",
    Description:"1450 Door",
    Id: "a0F1e000000EgcJEAS",
    Name: "Oven Option: Wall Oven"
    }];
    
    const options = [{
         Option: "a0F1e000000EgcJEAS",
         Price: 0
    }];
    
    data.forEach(x => {
      const selected = options.find(y => y.Option === x.Id);
      if (selected){
      x.Price = selected.Price;
      }
    })
    
    console.log(data);

    【讨论】:

    • Ran Turner 我的数据列表中没有名为价格的字段如何在数据列表中添加价格字段
    • 使用点符号。看上面的代码
    • selection 也是一个数组而不是单个对象 Ran Turner
    • 我更新了我的答案并将 selected 更改为数组(假设所选的选定对象位于索引 0..
    • @RanTurner 我没有复制你的答案,我提出了一种解决问题的新方法。我已经看到你的答案和upvoted 它使它有用。但是您最近所做的更改并不是 OP 想要的。该数组可能包含多个对象。所以这不是正确的解决方案。您需要在selected数组中找到对象然后添加Price?
    【解决方案3】:
    Below will do
    

    let one = [{
            Category__c: "Option",
            Description__c: "Exdoor",
            Id: "a0F1e000000EgcGEAS",
            Name: "with door",
    
        },
    
        {
            Category__c: "Upgrade",
            Description__c: "Exdoor",
            Id: "a0F1e000000EgcHEAS",
            Name: "Upgrade",
    
        },
    
        {
            Category__c: "New Option",
            Description__c: "1300 wide with doors",
            Id: "a0F1e000000EgcIEAS",
            Name: "doors",
    
        },
        {
            Category__c: "Oven",
            Description: "1450 Door",
            Id: "a0F1e000000EgcJEAS",
            Name: "Oven Option: Wall Oven"
        }
    ]
    
    let two = [{
        Option: "a0F1e000000EgcJEAS",
        Price: 0,
    }]
    
    function merge(one, two, oneKey, twoKey) {
      var byMap = {}
      two.forEach((el)=> {
        byMap[el[twoKey]] = el;
      });
      one.forEach((el)=> {
        Object.assign(el, byMap[el[oneKey]] || {});
      });
    }
    merge(one, two, "Id", "Option")
    console.log(one)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      相关资源
      最近更新 更多