我有下划线。
我有:
我想要更新多个属性,但保留其他属性不变。
不用写三行分别操作:
我想能够在一行代码中设置所有props,但也要保留其他属性不变。
如果我这样做:
结果对象已经去掉了时区。
这样的东西将会是理想的:
到目前为止,我已经做到了这一点,但它每次只能完全覆盖一个属性。
编辑:
好的,我觉得我接近了:
即使信息夹在对象的不同层级之间,这也会将其合并。
返回
但是像我说的一样,我想提供一个字符串路径来更新我想要更新的对象部分:
这个函数可以实现它,但不具有上述的合并行为。
我该如何编辑这个函数以包括合并行为?
我有:
var person = {
personal: {
fname: 'Victor',
lname: 'Lee',
address: {
street: '1234 Main',
state: {
abbrName: 'CA',
fullName: 'California',
timezone: 'PST'
},
zip: '94043'
}
}
};
我想要更新多个属性,但保留其他属性不变。
不用写三行分别操作:
person.personal.address.state.abbrName = 'OR';
person.personal.address.state.fullName = 'Oregon';
person.personal.address.zip = '97062';
我想能够在一行代码中设置所有props,但也要保留其他属性不变。
如果我这样做:
_.extend(person.personal.address, {
state: {
abbrName: 'OR',
fullName: 'Oregon'
},
zip: '97032'
});
结果对象已经去掉了时区。
{
personal: {
fname: 'Victor',
lname: 'Lee',
address: {
street: '1234 Main',
state: {
abbrName: 'CA',
fullName: 'California',
},
zip: '94043'
}
}
};
这样的东西将会是理想的:
var updateObj = function(obj, key, value){
// stuff
return obj;
};
and run like:
updateObj(person, 'personal.address', {
state: {
abbrName: 'OR',
fullName: 'Oregon'
},
zip: '97032'
});
到目前为止,我已经做到了这一点,但它每次只能完全覆盖一个属性。
var updateObjectWithStringKey = function(obj, key, value) {
if (typeof key === "string"){
key = key.split(".");
};
if (prop.length > 1) {
var e = key.shift();
updateObjectWithStringKey(obj[e] =
typeof obj[e] == 'object' ? obj[e] : {},
key,
value);
} else {
obj[key[0]] = value;
};
return obj;
};
编辑:
好的,我觉得我接近了:
var MergeRecursive = function(destination, source) {
for (var p in source) {
if ( typeof source[p] == 'object' ) {
destination[p] = MergeRecursive(destination[p], source[p]);
} else {
destination[p] = source[p];
};
};
return destination;
};
即使信息夹在对象的不同层级之间,这也会将其合并。
var person = {
personal: {
fname: 'Victor',
lname: 'Lee',
address: {
street: '1234 Main',
state: {
abbrName: 'CA',
fullName: 'California',
timezone: 'PST'
},
zip: '94043'
}
}
};
var updatedInfo = {
personal: {
address: {
state: {
abbrName: 'OR',
fullName: 'Oregon',
capital: 'Salem'
},
zip: '97062'
},
}
};
MergeRecursive(person, updatedInfo);
返回
{
personal: {
fname: 'Victor',
lname: 'Lee',
address: {
street: '1234 Main',
state: {
abbrName: 'OR',
fullName: 'Oregon',
timezone: 'PST',
capital: 'Salem'
},
zip: '97062'
}
}
}
但是像我说的一样,我想提供一个字符串路径来更新我想要更新的对象部分:
updateObj(person, 'personal.address', {
state: {
abbrName: 'OR',
fullName: 'Oregon',
capital: 'Salem'
},
zip: '97062'
});
这个函数可以实现它,但不具有上述的合并行为。
var updateObjectWithStringProp = function(obj, prop, value) {
if (typeof prop === "string") {
var prop = prop.split('.');
}
if (prop.length > 1) {
var p = prop.shift();
if (obj[p] == null || typeof obj[p] !== 'object') {
obj[p] = {};
}
updateObjectWithStringProp(obj[p], prop, value);
} else {
obj[prop[0]] = value;
}
return obj;
};
我该如何编辑这个函数以包括合并行为?
_.extend(person.personal.address, { state: 'MO', zip: 44444 })
呢? - Ken FranqueiroObject.prototype.toString.call(obj[e]) === "[object Object]"
而不是typeof obj[e] == 'object'
? - RobGobj2[p].constructor == Object
在许多情况下都会失败。 - RobG