簡體   English   中英

我該如何實現這個邏輯

[英]How can I implement this logic

我有如下的對象結構

var obj = {
   a : 1,
   b : [x,y,z],
   c : [0,1,3],
   d : ['%','-','+']
}

我想將該對象轉換為以下格式

{
  1 : {
     x : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     },
     y : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     },
     z : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     }
  }
}

如果在上述情況下['%','-','+']之后還有一個屬性,則相同的過程繼續..

var v = {}/* Object of above */, keys = Object.keys(v), simplifiedColumns = {};
for (var i = 0, l = keys.length; i < l ; i++) {
        if (v[i] instanceof Array) {

        }else{
              simplifiedColumns[keys[i]] = simplifiedColumns[keys[i]] || {};
        }
}

請建議我完成這個邏輯。

這是一個有效的算法,但它只會為xyz創建一個對象,並引用同一個對象。

此外,以下示例假定鍵的順序(由Object.keys() )與定義對象的順序相同。 情況並非總是如此,因此更好的解決方案是將對象更改為數組:

var obj = [
   {
        "key": "a",
        "value": 1
   },
   {
        "key": "b",
        "value": ["x","y","z"]
   },
   {
        "key": "c",
        "value": [0,1,3]
   },
   {
        "key": "d",
        "value": ['%','-','+']
   }
];

但無論如何,這里是使用原始對象表示法的算法:

var obj = {
   a : 1,
   b : ["x","y","z"],
   c : [0,1,3],
   d : ['%','-','+']
};

var keys = Object.keys(obj);

//set tempObj to the last array
var tempObj = obj[keys[keys.length - 1]];

//traverse the rest of the keys backwards
for (var i = keys.length - 2; i >= 0; i--) {
    var key = keys[i];

    //create new empty object
    var newObj = {};

    //append "tempObj" to that object and using the keys that are in the current array
    //or if the property isn't an array, use the property itself as key
    if (Array.isArray(obj[key])) {
        for (var k = 0; k < obj[key].length; k++) {
            newObj[obj[key][k]] = tempObj;
        }
    } else {
        newObj[obj[key]] = tempObj;
    }
    //override tempObj with the new created object
    tempObj = newObj;
}

小提琴

順便說一句,如果您需要單獨的獨立對象,您可以更改該行

newObj[obj[key]] = tempObj;

喜歡的東西

newObj[obj[key]] = copyObject(tempObj);

其中copyObject是一個創建對象深層副本的函數。 但我想在這種情況下,由於你一遍又一遍地復制相同的對象,性能將急劇下降。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM