映射数组到对象的深度基于单独的对象

Map array to object with depth based on separate object

本文关键字:对象 于单独 深度 数组 映射      更新时间:2023-09-26

我有一个数组的数据(实际上是一个解析CSV转储从MySQL与头)

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

我有一个对象,它定义了数据数组作为对象的样子。

{
  first_name : 0,
  last_name: 1,
  car : {
    make: 2,
    model: 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);

你可以尝试这样做:

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/

一个可能的解决方案!

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