【问题标题】:Merge two Object based on Object one value with Object two key基于对象一的值和对象二的键合并两个对象
【发布时间】:2022-01-03 11:20:23
【问题描述】:

想要将对象键值与另一个对象值合并。

假设结果对象键应与标头对象键名匹配,因为标头应为 CamelCase。 我有 headers 对象是:

let headers = [
  { key_name: 'pid', header_value: 'PID' },
  {
    key_name: 'card_no',
    header_value: 'Card Number'
  },
  {

    key_name: 'trans_id',
    header_value: 'Transaction ID'
  },
  {
    key_name: 'card_name',
    header_value: 'Card Name'
  }
]

结果对象是:

let results = let results = [
  {
    pid: '1234567890',
    card_no: '546.......3742',
    trans_id: '2019124453159',
    card_name: 'Mastercard',
    code: '$'
  },
  {
    pid: '1234567890',
    card_no: '546.......3742',
    trans_id: '2019120534555',
    card_name: 'Visa',
    code: 'INR'
  }
]

Header 对象 key_name 匹配值需要在最终结果对象中过滤,如下所示。 预期结果是:

let results = [
  {
    PID: '1234567890',
    Card Number: '546.......3742',
    Transaction ID: '2019124453159',
    Card Name: 'Mastercard'
  },
  {
    PID: '1234567890',
    Card Number: '546.......3742',
    Transaction ID: '2019120534555',
    Card Name: 'Visa'
  }
]

我尝试使用以下脚本仅返回所有值:

for (let index = 0; index < results.length; index++) {
for (let i = 0; i < headers.length; i++) {

console.log(results [index][header[i].key_name])
                    }
                }

【问题讨论】:

  • 好的,到目前为止你尝试了什么?
  • @Nitheesh 我更新了我的 sn-p

标签: javascript object


【解决方案1】:

我建议将第一个对象变成地图,这样您可以更快地查找。然后使用Object.entries 将您的对象转换为键/值对,执行映射和过滤,然后使用Object.fromEntries 将这些对转换回对象

let headers = [{ key_name: 'pid', header_value: 'PID' },{key_name: 'card_no',header_value: 'Card Number'},{key_name: 'trans_id',header_value: 'Transaction ID'},{key_name: 'card_name',header_value: 'Card Name'}];

// Convert to map:
let map = new Map(headers.map(({key_name, header_value}) => [key_name, header_value]));

let arr = [{pid: '1234567890',card_no: '546.......3742',trans_id: '2019124453159',card_name: 'Mastercard',code: '$'},{pid: '1234567890', card_no: '546.......3742',trans_id: '2019120534555',card_name: 'Visa',code: 'INR'}];

// Use map to make transition
let result = arr.map(obj => 
    Object.fromEntries(Object.entries(obj).map(([key, value]) => 
        map.has(key) && [map.get(key), value]
    ).filter(Boolean))
);

console.log(result);

【讨论】:

    【解决方案2】:

    您可以查看结果数组的Object.keys(..),以便将旧键值映射到新键值。 你可以使用这样的东西:

      const mappedHeaders = results.map((r) => {
        const keys = Object.keys(r);
        let newObj = {};
        for (const key of keys) {
          const newHeader = headers.find((h) => h.key_name === key);
          if (newHeader) newObj[newHeader.header_value] = r[key];
        }
        return newObj;
      });
    

    您可能需要检查映射是否存在并处理此类情况以避免错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2021-09-19
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多