有效的方式来从属性的阵列和阵列相匹配的属性值的创建JavaScript对象(efficient wa

2019-10-24 07:28发布

是否有可能创建的data1没有使用嵌套的for循环数组?

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

Answer 1:

您可以使用地图和的forEach

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

但它基本上是窝循环。



Answer 2:

或者你可以开始与JavaScript工具一样,提供类似这样的情况下,大量的实用工具功能下划线/ lodash库结识。

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

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

从本质上说是@epascarello提到的,你还在做一个双循环。 这只是更优雅(但须符合编码味道),更紧凑。



Answer 3:

无环...

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] + '})'));

猜猜它取决于你的有效的定义。



Answer 4:

使用本地地图和减少(这将嵌套的循环 - 但想我会在把它作为另一种选择)另一种实现:

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


Answer 5:

我终于想到了一个不使用嵌套的for循环的有效途径! :)

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


文章来源: efficient way to create JavaScript object from array of properties and array of matching property values