2016-08-04 133 views
0

我有一個要求圓點分隔的鍵,我有一個對象像obj={ 'a.b.c' : d } JavaScript對象,我想它轉換爲:{a:{b:{c:d}}}創建從在另一個對象

有什麼辦法,我可以做到這一點在JavaScript中?

+0

有沒有這樣的對象'{ABC:d} '。這是無效的語法。 – 2016-08-04 13:54:09

+0

@torazaburo如果你使用'obj [key]'語法創建一個空對象並設置屬性,這是完全有效的,儘管我不明白爲什麼。如果在對象聲明過程中將鍵設置爲字符串,它也可以工作。 – kag359six

+0

@ kag359six然後,OP應該修正他的問題,將它設置爲一個字符串,就像現在這樣,它是無效的語法。 – 2016-08-04 14:03:19

回答

0

這裏有一個解決方案(編輯:代碼比以前更復雜,但是它給你想要的結果,讓我知道,如果事情不工作):

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方法是真正的肉。它下面的兩個函數只是輔助方法。

+0

他不希望'{'abc':22,'abd':42}'產生'{a:{b:{c:22,d:42}}} ? – 2016-08-04 14:09:48

+0

是的我想要你在說什麼torazaburo – user1835326

+0

@ kag359six感謝您的答案。它是有益的。但如果什麼建議torazaburo是可能的,那麼它將是完美的 – user1835326

0

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));

相關問題