使用 lodash 映射键或任何其他 javascript 方法 (NodeJs) 动态更改对象键

Posted

技术标签:

【中文标题】使用 lodash 映射键或任何其他 javascript 方法 (NodeJs) 动态更改对象键【英文标题】:Dynamically changing object keys with lodash map keys or any other javascript methods(NodeJs) 【发布时间】:2018-05-31 16:13:00 【问题描述】:

这是我的 json 对象:

 
excels:
   [  field1: 'Mohamed',
       field2: '123456789',
       field3: 'Sameer',
       field4: 'Chennai',
       field5: 'Chennai',
       field6: 'Asia',
       field7: '11111',
       field8: '10-10-1990',
       field9: 'sameer@gmail.com',

      field1: 'Ganesh',
       field2: '987654321',
       field3: 'Pandiyan',
       field4: 'Chennai',
       field5: 'Chennai',
       field6: 'Asia',
       field7: '11111',
       field8: '10-10-1990',
       field9: 'ganesh@gmail.com'  ],
  header:
    '1': 'firstName',
     '2': 'gsm',
     '3': 'lastName',
     '4': 'street',
     '5': 'city',
     '6': 'region',
     '7': 'postcode',
     '8': 'dob',
     '9': 'email'  


我想把上面的json做成这样:

[firstName:Mohamed;gsm:123456789;lastName:Sameer;street:Chennai;city:Chennai;region:Asia;postcode:11111;dob:10-10-1990;email:sameer@gmail.com,firstName:Ganesh;gsm:987654321;lastName:Pandiyan;street:Chennai;city:Chennai;region:Asia;postcode:11111;dob:10-10-1990;email:ganesh@gmail.com]

但有一个条件, 如果我的 json 标头对象看起来像:

header: 
    '1': 'lastName',
     '2': 'gsm',
     '3': 'firstName',
     '4': 'street',
     '5': 'city',
     '6': 'region',
     '7': 'postcode',
     '8': 'dob',
     '9': 'email'  

P.S:我正在更改名字和姓氏顺序

我想把上面的json做成这样:

[firstName:Sameer;gsm:123456789;lastName:Mohamed;street:Chennai;city:Chennai;region:Asia;postcode:11111;dob:10-10-1990;email:sameer@gmail.com,firstName:Pandiyan;gsm:987654321;lastName:Ganesh;street:Chennai;city:Chennai;region:Asia;postcode:11111;dob:10-10-1990;email:ganesh@gmail.com]

查看名字和姓氏

如何做到这一点?任何js方法都可以做到这一点吗?

【问题讨论】:

完全有可能。但是您尝试过什么? 我得到这个 json,但我不知道如何制作这样的结构,所以只有我在寻找解决方案? 看看reduce对象,使用空对象作为statrting值,迭代你的header对象并从你的excel数组的每个条目中建立你的结果 @ilmrions 你能贴一些代码吗!这对我真的很有帮助:) 【参考方案1】:

您可以通过执行一些简单的数组/对象操作来做到这一点,

var result = source.excels.map((details) =>
  Object.keys(details).reduce((a, b) =>
    (a[source.header[b.replace('field', '')]] =
      details[b], a), ));

console.log(result);
// result would contain [firstName:'Mohamed',gsm:123456789, ......

DEMO

在这里学习Array#mapArray#reduceObject#keysArrow functions

注意:在交易对象时,我们不能依赖订单。这就是我依赖密钥字符串的原因。

【讨论】:

***.com/questions/47883754/…帮帮我【参考方案2】:

您可以使用本机 .map 和 .reduce 方法来做到这一点:

const persons =  
  excels:
     [  field1: 'Mohamed',
         field2: '123456789',
         field3: 'Sameer',
         field4: 'Chennai',
         field5: 'Chennai',
         field6: 'Asia',
         field7: '11111',
         field8: '10-10-1990',
         field9: 'sameer@gmail.com',

        field1: 'Ganesh',
         field2: '987654321',
         field3: 'Pandiyan',
         field4: 'Chennai',
         field5: 'Chennai',
         field6: 'Asia',
         field7: '11111',
         field8: '10-10-1990',
         field9: 'ganesh@gmail.com'  ],
    header:
      '1': 'firstName',
       '2': 'gsm',
       '3': 'lastName',
       '4': 'street',
       '5': 'city',
       '6': 'region',
       '7': 'postcode',
       '8': 'dob',
       '9': 'email'  


const personKeys = Object.keys(persons.header)

const formattedPersons = persons.excels.map((p) => 
    const formattedPerson = personKeys.reduce((newPerson, currentKey) => 
    newPerson[persons.header[currentKey]] = p[`field$currentKey`]

    return newPerson
  , )


  return formattedPerson;
)

【讨论】:

以上是关于使用 lodash 映射键或任何其他 javascript 方法 (NodeJs) 动态更改对象键的主要内容,如果未能解决你的问题,请参考以下文章

OSX:将大写锁定键重新映射到功能键或 Fn?

在 ReactJS 上使用 Lodash 对映射列表进行排序

将枚举映射到键或值的类型

lodash - slice

Map(映射)

Map(映射)