如何使用另一个对象中的匹配键值替换对象键

7

我有一个对象:

{pm: 'val 1', dm: 'val 2', cm: 'val 3'}

我想循环遍历这个对象,并检查另一个对象中是否存在任何键,

如果存在,则用其他对象中与匹配的键相对应的值替换键。

{pm: 'price', dm: 'discount', cm: 'cost'}

期望输出为:

{price: 'val 1', discount: 'val 2', cost: 'val 3'}


如果它们不在另一个对象中,您是否希望将键/值存在最终对象中? - Code Maniac
是的,我刚意识到这是一个完美的情况,其中一切都匹配,但如果第一个对象中只有“pm”,我需要它能够正常工作。 - UXCODA
你想在最终输出中包含剩余的键/值而不进行更改吗? - Code Maniac
第二个对象将手动创建,因此它肯定具有所有可能匹配的键。我担心在第一个对象中没有传递完全相同的键,但在测试了其中一个答案后,似乎在那种情况下也可以工作。 - UXCODA
9个回答

3
你可以使用 reduce 方法,在另一个对象中检查键的存在,然后将 anotherObj 的值作为键添加到最终对象中。

let obj = {pm: 'val 1', dm: 'val 2', cm: 'val 3', 'xy':'val 4'}
let anotherObj = {pm: 'price', dm: 'discount', cm: 'cost'}

let final = Object.entries(obj).reduce((op, [key,value]) => {
  let newKey = anotherObj[key]
  op[newKey || key ] = value
  return op
},{})

console.log(final)


2
这是最有效的方法。 在此处检查所有上述答案的性能表现 最初的回答。

var obj1 = {pm: 'val 1', dm: 'val 2', cm: 'val 3', mm: 'val 4'};
var obj2 = {pm: 'price', dm: 'discount', cm: 'cost'};
var output = {};

for(var key in obj1){
  if(obj2[key]){
    output[obj2[key]] = obj1[key];
  } else {
    output[key] = obj1[key];
  }
};

console.log(output)


1
如何创建可运行的堆栈片段? - adiga

1
使用Object.entriesreduce

const obj1 = {pm: 'val 1', dm: 'val 2', cm: 'val 3'};
const obj2 = {pm: 'price', dm: 'discount', cm: 'cost'};
const res = Object.entries(obj1).reduce((acc, [k, v]) => ({ ...acc, [obj2[k] || k]: v }), {});
console.log(res);


1
你可以按照以下步骤操作:
  • 使用Object.entries()获取第一个对象的条目。
  • 在条目数组上使用map()
  • 在map中检查当前键是否存在于第二个对象中,如果是,则返回一个更改了键的条目,否则返回相同的条目。
  • 最后使用Object.fromEntries()获取一个对象。

const obj1 = {pm: 'val 1', dm: 'val 2', cm: 'val 3'}
const obj2 = {pm: 'price', dm: 'discount', cm: 'cost'}

const res = Object.fromEntries(
                Object.entries(obj1)
                     .map(([k,v]) => [(obj2[k] || k), v])
            )

console.log(res)


1
您可以使用Object.entries将键对象转换为数组,并使用reduce循环遍历该数组。

var val = {"pm":"val 1","dm":"val 2","cm":"val 3"};
var key = {"pm":"price","dm":"discount","cm":"cost"};

var result = Object.entries(key).reduce((c, [v, k]) => Object.assign(c, {[k]: val[v] || null}), {});

console.log(result)


1

您可以使用Object.keysArray.reduce以简洁的方式实现此目标,如下所示:

let vals = {pm: 'val 1', dm: 'val 2', cm: 'val 3'}
let keys = {pm: 'price', dm: 'discount', cm: 'cost'}

let result = Object.keys(keys).reduce((r,k) => (r[keys[k]] = vals[k]) && r, {})

console.log(result)


1
你可以使用 obj[key] 语法访问和定义键。看下面的代码如何循环遍历 obj2,如果匹配,则将值来自 obj2[key] 的新节点作为键(res[obj2[key]])添加到 res 上。我添加了一个额外的键 mm,这样您就可以看到当它不匹配时会发生什么。

const obj1 = {pm: 'val 1', dm: 'val 2', cm: 'val 3', mm: 'val 4'};
const obj2 = {pm: 'price', dm: 'discount', cm: 'cost'};
const res = {};

for(let key in obj1){
  if(obj2[key]){
    res[obj2[key]] = obj1[key];
  } else {
    res[key] = obj1[key];
  }
};

console.log(res);

希望这可以帮到你!

0
您可以尝试以下代码
const obj1 = {pm: 'val 1', dm: 'val 2', cm: 'val 3'},
  obj2 = {pm: 'price', dm: 'discount', cm: 'cost'},
  obj = {};
Object.keys(obj2).forEach( key2 => {
   Object.keys(obj1).forEach( key1 => {
      if (key2 === key1) {
        obj[obj2[key2]] = obj1[key1]
      }
   });
 });
console.log(obj)

这是一个演示 https://codepen.io/phuongnm153/pen/PvmeEN


0
一个非常直接的方法:
let obj = {pm: 'val 1', dm: 'val 2', cm: 'val 3'};
let otherObj = { dm: 'val 9'}

for(let key in obj){
  if(otherObj[key] != null) {
     obj[key] = otherObj[key]
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接