2015-10-20 18 views
1

隨深度對象我有數據的陣列(在現實中解析CSV從MySQL轉儲與標題)地圖陣列基於單獨的對象

['adam', 'smith', 'honda', 'civic'] 

我有一個對象定義數據的數組應該如何看起來像一個對象。

{ 
    first_name : 0, 
    last_name: 1, 
    car : { 
    make: 2, 
    model: 3 
    } 
} 

該對象可以有任何深度的嵌套值。它也是動態生成的。

我的問題是:如何將數組中的值轉換爲對象?我試圖做一個遞歸函數循環遍歷對象,並抓取數組,當前,但繼續運行到牆壁。如果我得到它的工作,我會發布它,但我懷疑有一個更簡單的方法來實現這一點。)

回答

3

下面是做到這一點的方法之一。它適用於您提交的案例。

小提琴:http://jsfiddle.net/wy0doL5d/8/

var arr = ['adam', 'smith', 'honda', 'civic'] 

var obj = { 
    first_name : 0, 
    last_name: 1, 
    car : { 
    make: 2, 
    model: 3 
    } 
} 

function mapObj(o, a) 
{ 
    Object.keys(o).forEach(function(key){ 
     var objType = typeof(o[key]); 
     if(objType === "object") 
     { 
      mapObj(o[key], a); 
     } 
     else 
     { 
      o[key] = a[o[key]]; 
     } 
    }); 

} 

mapObj(obj, arr); 
+0

我們有幾乎相同的代碼!英雄所見略同! =]出於某種原因,我總是遠離forEach。但我不知道爲什麼。大聲笑+1 – AtheistP3ace

1

你可以嘗試這樣的事:

var myarray = ['adam', 'smith', 'honda', 'civic']; 
var myobject = { 
    first_name: 0, 
    last_name: 1, 
    car: { 
     make: 2, 
     model: 3 
    } 
}; 

function objectLoop(obj) { 
    for (var key in obj) { 
     if (obj.hasOwnProperty(key)) { 
      if (typeof obj[key] == 'number') { 
       obj[key] = myarray[obj[key]]; 
      } else { 
       objectLoop(obj[key]); 
      } 
     } 
    } 
    return obj; 
} 

console.log(objectLoop(myobject)); 

這是一個快速的寫操作。可能有一些使用情況我沒有考慮,但它確實適用於上面的數據。它可以被擴展。

小提琴:http://jsfiddle.net/qyga4p58/

1

一個可能的解決方案!

var arr =['adam', 'smith', 'honda', 'civic']; 
 
var obj = { 
 
    first_name : 0, 
 
    last_name: 1, 
 
    car : { 
 
    make: 2, 
 
    model: 3 
 
    } 
 
} 
 

 
function isNumber(n) { 
 
    return !isNaN(parseFloat(n)) && isFinite(n); 
 
} 
 

 
function extract(argObj , argArr){ 
 
    var o = {}; 
 
    Object.keys(argObj).forEach(function(k){ 
 
     
 
     var curDef = argObj[k]; 
 
     if(isNumber(curDef)){ 
 
     o[k] = argArr[ curDef ]; 
 
     return; 
 
     } 
 
     o[k] = extract(curDef , argArr); 
 
    }) 
 
    return o; 
 
} 
 
var newO = extract(obj, arr); 
 

 
console.dir(newO); 
 
document.body.innerHTML+= '<pre>' + JSON.stringify(newO , null , ' ') + '</pre>';