我有一個要求圓點分隔的鍵,我有一個對象像obj={ 'a.b.c' : d }
JavaScript對象,我想它轉換爲:{a:{b:{c:d}}}
創建從在另一個對象
有什麼辦法,我可以做到這一點在JavaScript中?
我有一個要求圓點分隔的鍵,我有一個對象像obj={ 'a.b.c' : d }
JavaScript對象,我想它轉換爲:{a:{b:{c:d}}}
創建從在另一個對象
有什麼辦法,我可以做到這一點在JavaScript中?
這裏有一個解決方案(編輯:代碼比以前更復雜,但是它給你想要的結果,讓我知道,如果事情不工作):
var obj = {
'a.b.c': 22,
'a.b.d.e': 42
}
var newObj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var keyList = key.split('.');
newObj = generateNewObject(keyList, keyList.length - 1, newObj, obj[key]);
}
}
console.log(newObj);
function generateNewObject(keys, index, existingObj, value) {
if (index < 0) {
return value;
}
var lastKey = keys[index--];
var existingProperty = getProperty(existingObj, lastKey);
if (existingProperty != null && !objectsAreEqual(existingProperty, value)) {
var valueKey = keys[index + 2];
existingProperty[lastKey][valueKey] = value[valueKey];
value = existingProperty;
} else {
var subObj = {};
subObj[lastKey] = value;
value = subObj;
}
return generateNewObject(keys, index, existingObj, value);
}
function objectsAreEqual(obj1, obj2) {
for (var key in obj1) {
if (obj1.hasOwnProperty(key)) {
var prop = getProperty(obj2, key);
if (prop == null) {
return false;
}
}
}
return true;
}
function getProperty(obj, keyDesired) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (key === keyDesired) {
return obj;
} else {
var prop = getProperty(obj[key], keyDesired);
if (prop != null) {
return prop;
}
}
}
}
return null;
}
我不知道爲什麼你會有一個這樣命名的對象,但是這段代碼會爲對象中的每個鍵做訣竅。這在嵌套對象(如{'a' : { 'b' { 'c' : {{'d' : 'e'}}}}}
)上無法正常工作。每次該值爲JavaScript對象時,您都必須重複執行for循環部分。
EDIT
我修改代碼,以便能夠識別當兩個屬性是例如相同的例子{ 'a.b.c' : 22 }, 'a.b.c.d.e' : 42
。對不起,如果很難通過,但基本上generateNewObject
方法是真正的肉。它下面的兩個函數只是輔助方法。
他不希望'{'abc':22,'abd':42}'產生'{a:{b:{c:22,d:42}}} ? – 2016-08-04 14:09:48
是的我想要你在說什麼torazaburo – user1835326
@ kag359six感謝您的答案。它是有益的。但如果什麼建議torazaburo是可能的,那麼它將是完美的 – user1835326
Array.reduce
對於更復雜的數據結構的處理/轉換大多是一個不錯的選擇。這一般解決給定的問題,同時考慮極端情況考慮那麼可能類似於下一提供的示例的方法...
var
d = 'd',
q = 'q',
obj = {
'i.k.l.m.n.o.p' : q,
'a.b.c' : d,
'foo' : 'bar',
'' : 'empty'
};
function parseIntoNestedTypes(type) {
return Object.keys(type).reduce(function (collector, integralKey) {
var
nestedType = collector.target,
fragmentedKeyList = integralKey.split('.'),
nestedTypeRootKey = fragmentedKeyList.shift(),
nestedTypeEndValue = collector.source[integralKey];
if (fragmentedKeyList.length === 0) {
nestedType[nestedTypeRootKey] = nestedTypeEndValue;
} else {
nestedType[nestedTypeRootKey] = fragmentedKeyList.reduce(function (collector, key, idx, list) {
var
partialType = collector.partialType || collector.type;
if (idx < (list.length - 1)) {
partialType[key] = {};
} else {
partialType[key] = collector.value;
}
collector.partialType = partialType[key];
return collector;
}, {
value : nestedTypeEndValue,
type : {}
}).type;
}
return collector;
}, {
source: type,
target: {}
}).target;
}
console.log('parseIntoNestedTypes :: type', JSON.stringify(obj));
console.log('parseIntoNestedTypes :: nestedType', JSON.stringify(parseIntoNestedTypes(obj)));
console.log('parseIntoNestedTypes :: type, nestedType : ', obj, parseIntoNestedTypes(obj));
有沒有這樣的對象'{ABC:d} '。這是無效的語法。 – 2016-08-04 13:54:09
@torazaburo如果你使用'obj [key]'語法創建一個空對象並設置屬性,這是完全有效的,儘管我不明白爲什麼。如果在對象聲明過程中將鍵設置爲字符串,它也可以工作。 – kag359six
@ kag359six然後,OP應該修正他的問題,將它設置爲一個字符串,就像現在這樣,它是無效的語法。 – 2016-08-04 14:03:19