是否有可能创建的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);
}
您可以使用地图和的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;
});
但它基本上是窝循环。
或者你可以开始与JavaScript工具一样,提供类似这样的情况下,大量的实用工具功能下划线/ lodash库结识。
例如,使用_.zipObject()所提供lodash :
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] + '})'));
猜猜它取决于你的有效的定义。
使用本地地图和减少(这将嵌套的循环 - 但想我会在把它作为另一种选择)另一种实现:
var data1 = data2.map(function(currentArray, index){
return currentArray.reduce(function(objToReturn, currentValue, index){
objToReturn[fields[index]] = currentValue;
return objToReturn;
},{});
});
我终于想到了一个不使用嵌套的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