我想在我的所有对象值中更改某些内容,例如
var a = {a:{c:1},b:2};
desire output : a = {a:{c:5},b:10} //multiply by 5
我这样做
var m = function n (o){
return Object.keys(o).map(function(v,i){
if(o[v] !== null && typeof o[v] === 'object') return n(o[v])
else return (o[v]*5);
})
}
a = m({a:{c:1},b:2})
但获得
的输出[
[
5
],
10
]
答案 0 :(得分:5)
要从另一个对象生成一个对象,人们会经常使用reduce
:
var a = {a: {c: 1}, b: 2};
var m = function n(o) {
return Object.keys(o).reduce(function(newObj, key) {
var value = o[key];
if (value !== null && typeof value === 'object') {
newObj[key] = n(value);
} else {
newObj[key] = value * 5;
}
return newObj;
}, {});
};
console.log(m(a));

我们传入一个新对象作为"累加器"并在其上设置属性,每次从reduce
回调中返回它,以便它通过整个过程。
这有时被称为" abusage" reduce
的{{1}},因为累加器的值永远不会改变(它总是相同的对象;对象的状态改变,但不是对象),而通常reduce
回调会改变通过它的值。
如果您愿意,forEach
关闭新对象是另一种常见方式:
var a = {a: {c: 1}, b: 2};
var m = function n(o) {
var newObj = {};
Object.keys(o).forEach(function(key) {
var value = o[key];
if (value !== null && typeof value === 'object') {
newObj[key] = n(value);
} else {
newObj[key] = value * 5;
}
});
return newObj;
};
console.log(m(a));

答案 1 :(得分:0)
您可以递归地执行此操作:
var myObj = {a:{c:1},b:2};
function changeChild(obj) {
var keys = Object.keys(obj);
keys.forEach(key => {
if (typeof obj[key] === "object") {
changeChild(obj[key])
} else if (typeof obj[key] === "number") {
obj[key] = obj[key] * 5;
}
});
}
changeChild(myObj);
console.log(myObj);
答案 2 :(得分:0)
更清洁的方式......
var m = function (object) {
for(var key in object) {
if(!!object[key] && typeof object[key] === 'object') {
object[key] = m(object[key]);
} else {
object[key] *= 5;
}
}
return object;
};
答案 3 :(得分:-1)
Array.map函数返回Array ..这就是原因......如果你知道在对象里面要改变什么,为什么不直接这样做呢?
从我的观点来看,你正在做一些非常简单的冗余执行。
你正在创建一个匿名函数,使用Object.keys来获取一个新数组(在迭代你的对象之后)
您正在使用Array.map从此数组创建另一个数组,并在其中创建(另一个)匿名函数以迭代新数组,然后在每次迭代你都会创建另外4个条件分支..