Javascript 基于单独对象将数组映射到具有深度的对象

Javascript 基于单独对象将数组映射到具有深度的对象,javascript,arrays,object,nested,converter,Javascript,Arrays,Object,Nested,Converter,我有一个数据数组(实际上是从MySQL解析的CSV转储,带有标题) 我有一个对象,它定义了数据数组作为对象的外观 { first_name : 0, last_name: 1, car : { make: 2, model: 3 } } 此对象可以具有任意深度的嵌套值。它也是动态生成的 我的问题是:如何将值从数组强制转换到对象 (我正在尝试在对象上进行递归函数循环,并获取当前数组,但仍在墙中运行。如果我让它工作,我将发布它,但我怀疑有一种更简单的方法来完成此操作

我有一个数据数组(实际上是从MySQL解析的CSV转储,带有标题)

我有一个对象,它定义了数据数组作为对象的外观

{
  first_name : 0,
  last_name: 1,
  car : {
    make: 2,
    model: 3
  }
}
此对象可以具有任意深度的嵌套值。它也是动态生成的

我的问题是:如何将值从数组强制转换到对象


(我正在尝试在对象上进行递归函数循环,并获取当前数组,但仍在墙中运行。如果我让它工作,我将发布它,但我怀疑有一种更简单的方法来完成此操作。)

您可以尝试以下方法:

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));
这封信写得很快。可能有一些用例我没有解释,但它确实适用于上面的数据。它可以在上展开


小提琴:你可以试试这样的东西:

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));
这封信写得很快。可能有一些用例我没有解释,但它确实适用于上面的数据。它可以在上展开


小提琴:这里有一种方法。它适用于您介绍的案例

小提琴:


这里有一种方法。它适用于您介绍的案例

小提琴:


可能的解决方案之一

var-arr=['adam','smith','honda','civic'];
var obj={
名字:0,
姓氏:1,
汽车:{
品牌:2,
型号:3
}
}
函数isNumber(n){
return!isNaN(parseFloat(n))和&isFinite(n);
}
函数提取(argObj、argArr){
var o={};
Object.keys(argObj).forEach(函数(k){
var curDef=argObj[k];
if(isNumber(curDef)){
o[k]=argArr[curDef];
返回;
}
o[k]=提取物(curDef,argArr);
})
返回o;
}
var newO=提取(obj,arr);
console.dir(newO);

document.body.innerHTML+=''+JSON.stringify(newO,null,'')+''可能的解决方案之一

var-arr=['adam','smith','honda','civic'];
var obj={
名字:0,
姓氏:1,
汽车:{
品牌:2,
型号:3
}
}
函数isNumber(n){
return!isNaN(parseFloat(n))和&isFinite(n);
}
函数提取(argObj、argArr){
var o={};
Object.keys(argObj).forEach(函数(k){
var curDef=argObj[k];
if(isNumber(curDef)){
o[k]=argArr[curDef];
返回;
}
o[k]=提取物(curDef,argArr);
})
返回o;
}
var newO=提取(obj,arr);
console.dir(newO);

document.body.innerHTML+=''+JSON.stringify(newO,null,'')+''我们有几乎相同的代码!英雄所见略同!=]出于某种原因,我总是远离forEach。但我不知道为什么。lol+1我们有几乎相同的代码!英雄所见略同!=]出于某种原因,我总是远离forEach。但我不知道为什么。lol+1
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);