我想合并嵌套的javascript对象。当对象的长度为1时,我很简单。但是,由于长度增加了,我需要一种动态的方法来合并address
键并序列化我的对象
var old = {account: "100000", address: {city: "LONDON", companyName: "Test IQUE", country: "UK", postalCode: "SW1A 2AA",}, meterName: "DM9"}
长度为1时,这对我有用
var new = {
'account' : "100000",
'address' : "LONDON, UK"
'companyName' : "Test IQUE",
'postalCode' : "SW1A 2AA",
'meterName' : "DM90"
},
{
'account' : "1000001",
'address' : "LONDON, UK"
'companyName' : "Test IQUE",
'postalCode' : "SW1A 2AA",
'meterName' : "DM90"
};
通常,我需要序列化嵌套的address
对象并将其合并为一个对象。由于每个对象的结构都是相同的,所以我一直在考虑对每个循环使用a,它可以将address的值组合为一个。
答案 0 :(得分:1)
您可以使用类似这样的内容:
var old = {
account: "100000",
address: {
city: "LONDON",
companyName: "Test IQUE",
country: "UK",
postalCode: "SW1A 2AA",
},
meterName: "DM9"
};
let flattenObject = (obj) => {
let flat = {};
for (const [key, value] of Object.entries(obj)) {
if (typeof value === 'object' && value !== null) {
for (const [subkey, subvalue] of Object.entries(value)) {
typeof flat[subkey] === 'undefined' ?
flat[subkey] = subvalue :
Array.isArray(flat[subkey]) ?
flat[subkey].push(subvalue) :
flat[subkey] = [flat[subkey], subvalue]
}
} else {
flat = {...flat, ...{[key]: value}};
}
}
return flat;
}
var flatted = flattenObject(old);
console.log(flatted);
答案 1 :(得分:0)
如果您询问如何从 addresss 对象获取完整的地址字符串,则可以使用以下代码:
'address': Object.values($scope.userDetails.address).join(', ');
Object.values()
函数会将您的address
对象更改为数组。
.join
方法会将来自此数组的所有元素连接到一个字符串中。这些元素将由作为参数传递的字符串分隔(在这种情况下为,
。
答案 2 :(得分:0)
您可以使用lodash lib:https://lodash.com/docs/4.17.15#assignIn
@see
_。assign(object,[sources])
function Foo() {
this.a = 1;
}
function Bar() {
this.c = 3;
}
Foo.prototype.b = 2;
Bar.prototype.d = 4;
_.assign({ 'a': 0 }, new Foo, new Bar);
// => { 'a': 1, 'c': 3 }
_。mergeWith(对象,其他,定制器);
function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
var object = { 'a': [1], 'b': [2] };
var other = { 'a': [3], 'b': [4] };
_.mergeWith(object, other, customizer);
// => { 'a': [1, 3], 'b': [2, 4] }