繁体   English   中英

从属性数组和匹配的属性值数组创建JavaScript对象的有效方法

[英]efficient way to create JavaScript object from array of properties and array of matching property values

是否可以在不使用嵌套的for循环的情况下创建data1数组?

// My starting Normalized data
var fields = ["name","age"];
var data2 = [["John",20],["Tom",25]]; 


// What I want the result to look like Denormalized
var data1 = [{"name":"John", "age":20},{"name":"Tom", "age":25}];


// My solution
var data1 = [];
for(var i = 0; i < data2.length; i++){
   var temp = {};
   for(var y = 0; y < fields.length; y++){
      temp[fields[y]] = data2[i][y];
   }
   data1.push(temp);
}

您可以使用mapforEach

var fields = ["name","age"];
var data2 = [["John",20],["Tom",25]]; 
var data1 = data2.map(function(arr){ 
   var obj = {};
   arr.forEach(function(val, ind){ obj[fields[ind]] = val; });
   return obj;
});

但基本上是嵌套循环。

或者,您可能开始熟悉下划线/点划线库之类的Javascript工具,这些库为此类情况提供了许多实用程序功能。

例如,使用lodash提供的_.zipObject ()

fields = ["name", "age"];
data2 = [["John", 20],["Tom", 25]];
res = [];
data2.forEach(function(arr) {
    res.push(_.zipObject(fields, arr));
});

本质上,如@epascarello所述,您仍在执行双循环。 它更加优雅(始终受编码口味的约束)并且更紧凑。

没有循环...

var data1 = [];
data1.push(eval('({"' + fields[0] + '":"' + data2[0][0] +
                '","' + fields[1] + '":' + data2[0][1] + '})'));
data1.push(eval('({"' + fields[0] + '":"' + data2[1][0] +
                '","' + fields[1] + '":' + data2[1][1] + '})'));

猜猜这取决于您对效率的定义。

另一种使用本机map和reduce的实现(将是嵌套循环-但我想将它作为另一种选择):

var data1 = data2.map(function(currentArray, index){
  return currentArray.reduce(function(objToReturn, currentValue, index){
    objToReturn[fields[index]] = currentValue;
    return objToReturn;
  },{});
});

我终于想到了一种不使用嵌套循环的有效方式! :)

var fields = ["name","age"];
var data2 = [["John",20],["Tom",25]]; 
var body = "";

for(var i = 0; i < fields.length; i++){
   body = body.concat("this."+fields[i] +"=args["+i+"]; ");
}

var model = new Function("args",body);

var data1 = [];
for(var i = 0; i < data2.length; i++){
   var x = new model(data2[i]);
   data1.push(x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM