【问题标题】:New object from another object by its key and values (js) [duplicate]通过其键和值(js)来自另一个对象的新对象[重复]
【发布时间】: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
  • 为什么不能从中创建一个新对象?

标签: javascript arrays object


【解决方案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({}, .... 的最后一个语法中使用扩展语法,这可能吗?我猜它可能更短更清晰
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多