首页 > 解决方案 > 在 Javascript 中过滤对象

问题描述

我想根据条件用另一个对象键更改对象键。

const obj = {
  name: 'carl',
  age: 2
};

const filterF = (obj, toChange, newV) => {
  return Object.keys(obj).reduce((acc, key) => {
    if (obj[key] === toChange) {
      acc[key] = newV;
    }
    return acc
  }, {})
}


console.log(filterF(obj, 'name', 'newName'))

基本上我希望这样:

{
  name: 'newName',
  age: 2
};

运行我的代码我得到一个空对象。如何修复代码?

标签: javascript

解决方案


您只需要添加或更新值

const obj = {
  name: 'carl',
  age: 2
};

const addOrUpdate= (obj, key, value) => { 
// no need to itterate
  obj[key] = value;
return obj
}


console.log(addOrUpdate(obj, 'name', 'newName'))

如果您只需要在其键已存在于对象中的情况下更新该值。

const obj = {
  name: 'carl',
  age: 2
};

const update= (obj, key, value) => { 
// no need to itterate
  if(obj.hasOwnProperty(key)) {
    obj[key] = value;
   }
return obj
}


console.log(update(obj, 'name', 'newName'))

// no new value added
console.log(update(obj, 'city', 'my city'))

如果您只是想知道如何使用 reduce 来实现这一点,仅用于学习目的。

您不应该在这里使用 reduce,因为您只是创建了前一个对象的浅表副本,但只是为了学习目的,我添加了一个示例以及您出错的地方。

const obj = {
  name: 'carl',
  age: 2
};

const filterF = (obj, toChange, newV) => {
  return Object.keys(obj).reduce((acc, key) => {
     // you had key wronly written as keys, and comparing objectp[key] value with new key
  if (key === toChange) {
      acc[key] = newV;
    } else {
      acc[key] = obj[key];
    }
    return acc
  }, {})
}


console.log(filterF(obj, 'name', 'newName'))


推荐阅读