有没有办法将对象的所有属性更改为给定值,例如更改为 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
}
}
答案 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
,否则,如果它是一个对象,我们只返回原始对象。
注意:如果您有一个不可序列化的对象类型(例如函数)作为您的值之一,那么此方法将删除该键值对。
如果您的对象具有一致的结构并且不包含无限嵌套的对象,您可能会发现循环遍历 obj1
(obj11
和 obj12
)的键更简单使用 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}));