通过其键和值(js)来自另一个对象的新对象[重复]

Posted

技术标签:

【中文标题】通过其键和值(js)来自另一个对象的新对象[重复]【英文标题】:New object from another object by its key and values (js) [duplicate] 【发布时间】:2021-01-16 08:25:07 【问题描述】:

我有一个非常奇怪的任务要完成。基本上我有这样的对象:


   a: 'abc',
   key1: 'someKeyOne',
   key2: 'someKeyTwo',
   value1: 'someValueOne',
   value2: 'someValueTwo',
   yetAnotherProperty: 'dadjsa'

我的目标是从作为键和值的属性创建新对象,因此新对象将是:


  someKeyOne: 'someValueOne',
  someKeyTwo: 'someValueTwo',

在对象中可以有许多“非键”或“非值”属性,但keyXvalueX 的数量总是相同的。我尝试使用 Object.keys 并检查是否键 includes 键,然后是值,但我无法从中创建新对象...

有什么建议吗?

【问题讨论】:

keyX 和 keyX,我想你的意思是 keyX 和 valueX 为什么不能从中创建一个新对象? 【参考方案1】:

您可以使用Object.entries 获取原始对象的键/值对。过滤键类似于“keyX”的那些(使用正则表达式),并从对象中获取相应的“valueX”值。将键/值对映射到这个新对。最后用Object.fromEntries从这些对中创建一个对象:

let obj = a: 'abc',key1: 'someKeyOne',key2: 'someKeyTwo',value1: 'someValueOne',value2: 'someValueTwo',yetAnotherProperty: 'dadjsa';

let result = Object.fromEntries(
    Object.entries(obj).filter(([k]) => /^key\d+$/.test(k))
                       .map(([k, v]) => [v, obj["value" + k.slice(3)]])
);

console.log(result);

如果您不支持Object.fromEntries,您可以使用Object.assign,您可以为每个新对添加一个参数。在这种情况下,这样的一对必须表示为一个(小)对象,只有一个键:

let obj = a: 'abc',key1: 'someKeyOne',key2: 'someKeyTwo',value1: 'someValueOne',value2: 'someValueTwo',yetAnotherProperty: 'dadjsa';

let result = Object.assign(, 
    ...Object.entries(obj).filter(([k]) => /^key\d+$/.test(k))
                          .map(([k, v]) => ( [v]: obj["value" + k.slice(3)] ))
);

console.log(result);

反之,请执行以下操作:

let obj =  someKeyOne: 'someValueOne', someKeyTwo: 'someValueTwo';

let result = Object.fromEntries( 
    Object.entries(obj).flatMap(([k, v], i) => 
        [[`key$i+1`, k], [`value$i+1`, v]]
    )
);

console.log(result);

同样使用Object.assign 而不是Object.fromEntries

let obj =  someKeyOne: 'someValueOne', someKeyTwo: 'someValueTwo';

let result = Object.assign(,
    ...Object.entries(obj).map(([k, v], i) => ( 
        ["key" + (i+1)]: k, 
        ["value" + (i+1)]: v
    ))
);

console.log(result);

【讨论】:

不幸的是,由于项目中的 ES 版本,我无法使用 Object.fromEntries :( 查看我的答案。 aaand 最后一个,我很抱歉!如果我们想逆转这个过程怎么办?所以我们有了我们的对象,并希望以 key1、value1、key2 等形式将其取回...... 您不应该提出后续问题。您应该首先尝试,当您无法实现时,请提出一个适当的新问题,展示您的尝试。但是好的,我在这个答案中添加了一个 sn-p 。你欠我。 ;-) 很抱歉@trincot,只是想以某种方式在Object.assign(, .... 的最后一个语法中使用扩展语法,这可能吗?我猜它可能更短更清晰

以上是关于通过其键和值(js)来自另一个对象的新对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将两个数组(键和值)合并为一个对象[重复]

将通用JS集合转换为具有特定键和分组值的对象

与参数匹配时返回对象的键和值[重复]

Javascript映射函数:向对象添加新键和值[重复]

在HashMap中使用相同的对象作为键和值

高效地将 JavaScript 键和值数组转换为对象