【问题标题】:Map array to object with depth based on separate object基于单独对象将数组映射到具有深度的对象
【发布时间】:2016-01-19 13:56:42
【问题描述】:

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

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

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

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

这个对象可以有任意深度的嵌套值。它也是动态生成的。

我的问题是:如何将数组中的值转换为对象?

(我正在尝试在对象上创建一个递归函数循环并当前抓取数组但继续运行到墙壁。如果我让它工作,我会发布它,但我怀疑有一种更简单的方法来完成这个。 )

【问题讨论】:

    标签: javascript arrays object nested converter


    【解决方案1】:

    这是一种方法。它适用于您提出的案例。

    小提琴: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);
    

    【讨论】:

    • 我们的代码几乎相同!英雄所见略同! =]出于某种原因,我总是远离forEach。但我不确定为什么。哈哈+1
    【解决方案2】:

    你可以试试这样的:

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

    这是一篇快速的文章。可能有一些我没有考虑到的用例,但它确实适用于您的上述数据。可以def展开。

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

    【讨论】:

      【解决方案3】:

      一种可能的解决方案!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2021-12-04
        • 1970-01-01
        相关资源
        最近更新 更多