更改对象的所有属性

时间:2021-03-19 22:50:01

标签: javascript

有没有办法将对象的所有属性更改为给定值,例如更改为 0?它适用于嵌套对象吗?

我想这是一个菜鸟问题,但我几天前才开始玩 js。

编辑:

基本上是这样的:

var obj1 = {
  obj11: {
    a11: 1
    b11: 2
    c11: 321
  },

  obj12: {
    a12: 31
    b12: 65
    c12: 8776
  }
}

所有这些值都受其他一些函数的影响。我想做一个“重置”函数,将所有这些值设置为 0。我的预期输出是:

{
  obj11: {
    a11: 0
    b11: 0
    c11: 0
  },

  obj12: {
    a12: 0
    b12: 0
    c12: 0
  }
}

2 个答案:

答案 0 :(得分:1)

一种方法是利用 JSON.stringify()。使用它的 replacer 参数,您可以指定应该如何转换每个值。此方法还将递归遍历您的对象,允许您更改所有值。由于此函数将您的对象转换为字符串,因此您需要使用 JSON.parse():

将其转换回来

const obj1 = { obj11: { a11: 1, b11: 2, c11: 321 }, obj12: { a12: 31, b12: 65, c12: 8776 } };

const res = JSON.parse(JSON.stringify(obj1, (key, value) => Object(value) === value ? value : 0));
console.log(res);

上面使用了一个 arrow function,它传入一个键和一个值。这将为您的对象中的每个键/值调用。您从箭头函数返回的值是新对象中的新结果值。在这种情况下,当值不是对象时,该值是 0,否则,如果它是一个对象,我们只返回原始对象。

注意:如果您有一个不可序列化的对象类型(例如函数)作为您的值之一,那么此方法将删除该键值对。


如果您的对象具有一致的结构并且不包含无限嵌套的对象,您可能会发现循环遍历 obj1obj11obj12)的键更简单使用 for..in 循环,然后使用外部循环中当前循环的 on 键可以获得内部对象的键:

const obj1 = { obj11: { a11: 1, b11: 2, c11: 321 }, obj12: { a12: 31, b12: 65, c12: 8776 } };

const res = {};
for(const key in obj1) {
  res[key] = {};
  for(const innerKey in obj1[key]) {
    res[key][innerKey] = 0;
  }
}
console.log(res);


最后,您可以使用 recursive 方法,在该方法中您使用函数循环对象的 entries[[key, value], ...] 对数组),使用 .map() 到将每个 value 转换为 0。然后,您可以使用 Object.fromEntries() 从条目数组中重新构建您的对象。如果您遇到一个对象作为您的值之一,您可以调用此函数将相同的逻辑应用于嵌套值:

const obj1 = { obj11: { a11: 1, b11: 2, c11: 321 }, obj12: { a12: 31, b12: 65, c12: 8776 } };

const changeVals = (obj, newVal) =>
  Object.fromEntries(Object.entries(obj).map(
    ([key, val]) => 
      !Array.isArray(val) && Object(val) === val && typeof val === "object"
        ? [key, changeVals(val, newVal)] 
        : [key, newVal]
    )
  );
console.log(changeVals(obj1, 0));

答案 1 :(得分:0)

let obj1 = {
    obj11: {
        a11:1,
        b11:2,
        c11:321,
    },
    obj12: {
        a12:31,
        b12:65,
        c12:8776,
    },
};

// Declare a function with a single argument o.
function reset(o) {
  // Loop through all of the properties of the argument object o
  for([key, value] of Object.entries(o)) {
    const t = typeof value;
    switch(t) {
      // If the current property has an object value, handle that recursively.
      case 'object': reset(value); break;
      // If the current property has a numeric value, set the value to 0.
      case 'number': o[key] = 0; break;
      // Otherwise print some status information.
      default: console.log('The property '+key+'is of an unhandled type ('+t+').');
     }
   }
}

reset(obj1);

// Print the result for convenience.
console.log(JSON.stringify({obj1}));