【问题标题】:Move key/value in object array to other array by matched item通过匹配项将对象数组中的键/值移动到其他数组
【发布时间】:2023-03-26 08:03:01
【问题描述】:

我有两个数组,其中包含国家及其国家代码的对象。 其中一个数组有英文国家,也有国家的 isoCode 的键。它看起来像:

[{
 "name": "Denmark",
 "dialCode": "+45",
 "isoCode": "DK",
},
{
 "name": "Germany",
 "dialCode": "+49",
 "isoCode": "DE",
}]

另一个数组包含丹麦语的国家名称和拨号代码,但没有 isoCode。

[{
 "name": "Danmark",
 "dialCode": "+45",
},
{
 "name": "Tyskland",
 "dialCode": "+49",
}]

现在我想将 isoCode 从英语数组移动/复制到丹麦语,与 dialCode 匹配。 但我对如何做到这一点有点迷茫。

我有一个匹配的

let result = this.dkList.filter(country1 => this.countryList.some(country2 => country2.dialCode === country1.dialCode.replace('00 ', '+').trim()))

我的预期结果应该是

[{
    "name": "Danmark",
    "dialCode": "+45",
    "isoCode": "DK"
  },
  {
    "name": "Tyskland",
    "dialCode": "+49",
    "isoCode": "DE"
  }
]

【问题讨论】:

  • 您的数据不是数组。它是一个对象
  • @Nitheesh "两个带有对象的数组"...
  • @Nitheesh - 编辑了我的问题
  • 您是否也能提供一个使用上述数据的预期结果示例?
  • @NickParsons - 我已经编辑了我的问题

标签: javascript arrays object


【解决方案1】:

只需遍历所有数组元素,比较它们的 dialCodes 并将 isoCodes 复制到丹麦版本。

const en = [...]; // array with english data
const den = [...]; // array with danish data

// it will work if en.length = den.length
for (let i = 0; i < en.length; i++) {
  if (den[i].dialCode === en[i].dialCode) { // compare en & den dial codes
    den[i].isoCode = en[i].isoCode;
  }
}

【讨论】:

    【解决方案2】:

    .filter() 方法用于从数组中删除项目,这不是您要在此处执行的操作,而是要映射(即:转换)您的数据。

    您可以首先从您的第一个数组创建一个名为isoLookupMap,该数组基于该数组创建键。在dialCode 和基于数组中isoCode 的值上。然后,您可以使用dialCode 获取此地图以获取 ISO 代码。创建 Map 查找后,您可以在第二个 arr2 上使用 .map() 将您的对象映射到具有 isoCode 属性的新对象,该属性包含从 Map 查找中获得的值:

    const arr1 = [{ "name": "Denmark", "dialCode": "+45", "isoCode": "DK", }, { "name": "Germany", "dialCode": "+49", "isoCode": "DE", }];
    const arr2 = [{ "name": "Danmark", "dialCode": "+45", }, { "name": "Tyskland", "dialCode": "+49", }];
    
    const isoLookup = new Map(arr1.map(obj => [obj.dialCode, obj.isoCode]));
    const res = arr2.map(obj => ({...obj, isoCode: isoLookup.get(obj.dialCode)}));
    console.log(res);

    创建一个用作查找的地图可以让您的代码很好地扩展,这与通过 arr1 为您的 .map() 方法的每次迭代执行搜索相反。

    【讨论】:

    • 谢谢!会调查这个!我正在使用过滤器从英语数组中删除在丹麦数组中找不到的国家/地区,例如“南极洲”。
    • @MortenHagh 啊,明白了,我把它误认为是无效的代码。好吧,.map() 这应该是我们所需要的
    • 让您的代码与我的完美配合!谢谢!
    【解决方案3】:
    var en = []
    var den = []
    den.forEach(eni => {
        en.forEach(deni => {
            if (eni.dialcode == deni.dialcode) {
                den.dialcode = en.dialcode
            }
        })
    })
    

    现在你应该在 var den 中有数组

    【讨论】:

      【解决方案4】:

      因为两个列表都包含dialCode: 和Array.prototype.reduce(),您可以根据dialCode 属性从arr1 创建一个哈希,最后从Array.prototype.map() arr2 列表中得到结果

      代码:

      const arr1 = [{name: 'Denmark',dialCode: '+45',isoCode: 'DK',},{name: 'Germany',dialCode: '+49',isoCode: 'DE'}]
      const arr2 = [{name: ' Danmark',dialCode: '+45',},{name: 'Tyskland',dialCode: '+49'}]
      
      const hash = arr1.reduce((a, c) => ((a[c.dialCode] = c.isoCode), a), {});
      const restult = arr2.map(c => ({ ...c, isoCode: hash[c.dialCode] }));
      
      console.log(restult);

      【讨论】:

        【解决方案5】:

        如果不介意的话,一条线的解决方案

        const arr1 = [{ "name": "Denmark", "dialCode": "+45", "isoCode": "DK", }, { "name": "Germany", "dialCode": "+49", "isoCode": "DE", }];
        const arr2 = [{ "name": "Danmark", "dialCode": "+45", }, { "name": "Tyskland", "dialCode": "+49", }];
        
        result = arr1.map(({ dialCode, isoCode }) => ({ name: arr2.find((o) => dialCode === o.dialCode).name, dialCode, isoCode }));
        
        console.log(result);

        【讨论】:

          猜你喜欢
          • 2016-04-16
          • 2021-05-17
          • 2020-04-13
          • 2021-01-26
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 2019-08-30
          • 2014-09-01
          相关资源
          最近更新 更多