如何为 javascript 数组中的每个对象动态添加属性
How to add properties dynamically to each object in an javascript array
我试图遍历一个对象数组,为每个对象添加一个属性和值。 table 的顺序很重要,因为我正在尝试使用 handsontable 视图作为客户端来检索服务器端 mysql table 的内容。我希望 handsontable 视图与 table 具有相同的列顺序,但我想插入一个复选框列作为第一列以允许记录选择。我有一个执行循环的 fiddle http://jsfiddle.net/kc11/juo1e4at/#base,但我不确定如何为每个对象的属性值对添加前缀。 array unshift 似乎适用于数组。我想要一个对象的结果来自:
Object { car="Audi A4 Avant", year=2011, available=true, more...}
至:
Object { checkbox=false, car="Audi A4 Avant", year=2011, available=true, more...}
我怎样才能做到这一点
这是在您的 fiddle 中使用 getCarData
函数的示例。它允许您通过将此功能包装在一个简单的 class(称为 PrependableObject
)中来为对象添加键。
PrependableObject = function(obj){
this.obj = obj;
}
PrependableObject.prototype.prepend = function(key, val){
var newObj = new Object(),
oldKeys = Object.keys(this.obj);
newObj[key] = val;
for (var i=0; i< oldKeys.length; i++){
newObj[oldKeys[i]] = this.obj[oldKeys[i]];
}
return newObj;
}
function getCarData() {
return [
{car: "Mercedes A 160", year: 2006, available: true, comesInBlack: 'yes'},
{car: "Citroen C4 Coupe", year: 2008, available: false, comesInBlack: 'yes'},
{car: "Audi A4 Avant", year: 2011, available: true, comesInBlack: 'no'},
{car: "Opel Astra", year: 2004, available: false, comesInBlack: 'yes'},
{car: "BMW 320i Coupe", year: 2011, available: false, comesInBlack: 'no'}
];
}
var carData = getCarData();
carData.forEach(function(obj, index){
var obj = new PrependableObject(obj),
newObj = obj.prepend('check', false);
carData[index] = newObj;
});
// To prove the keys are in the correct order
var car1 = carData[0];
Object.keys(car1).forEach(function(key, i){
console.log(key + ' = ' + car1[key]);
});
已更新fiddle:
http://jsfiddle.net/juo1e4at/4/
当然,您的 forEach
循环中的逻辑可以做任何事情(例如,使用汽车模型来确定要分配给对象的动态值、汽车年份等)。
Javascript 对象中属性的顺序无关紧要,它们的顺序并不严格。
鉴于
var cars = [
{car: "Mercedes A 160", year: 2006, available: true, comesInBlack: 'yes'},
{car: "Citroen C4 Coupe", year: 2008, available: false, comesInBlack: 'yes'},
{car: "Audi A4 Avant", year: 2011, available: true, comesInBlack: 'no'},
{car: "Opel Astra", year: 2004, available: false, comesInBlack: 'yes'},
{car: "BMW 320i Coupe", year: 2011, available: false, comesInBlack: 'no'}
];
如果您没有属性准备好从后端发送或出于其他原因(较小的负载大小等)想在前端发送,您可以简单地执行以下操作。
for (i in cars) {
cars[i].checkbox = false;
}
现在回到Handsontable列顺序的问题(其实是本题的主要问题),可以这样定义:
var hot = new Handsontable(container,{
data: cars,
/* Other config */
columns: [
{data: "checkbox", type: 'checkbox'},
{data: "car", type: 'text'}
/*Other columns*/
]
});
有关详细信息,请参阅 the manual。
我试图遍历一个对象数组,为每个对象添加一个属性和值。 table 的顺序很重要,因为我正在尝试使用 handsontable 视图作为客户端来检索服务器端 mysql table 的内容。我希望 handsontable 视图与 table 具有相同的列顺序,但我想插入一个复选框列作为第一列以允许记录选择。我有一个执行循环的 fiddle http://jsfiddle.net/kc11/juo1e4at/#base,但我不确定如何为每个对象的属性值对添加前缀。 array unshift 似乎适用于数组。我想要一个对象的结果来自:
Object { car="Audi A4 Avant", year=2011, available=true, more...}
至:
Object { checkbox=false, car="Audi A4 Avant", year=2011, available=true, more...}
我怎样才能做到这一点
这是在您的 fiddle 中使用 getCarData
函数的示例。它允许您通过将此功能包装在一个简单的 class(称为 PrependableObject
)中来为对象添加键。
PrependableObject = function(obj){
this.obj = obj;
}
PrependableObject.prototype.prepend = function(key, val){
var newObj = new Object(),
oldKeys = Object.keys(this.obj);
newObj[key] = val;
for (var i=0; i< oldKeys.length; i++){
newObj[oldKeys[i]] = this.obj[oldKeys[i]];
}
return newObj;
}
function getCarData() {
return [
{car: "Mercedes A 160", year: 2006, available: true, comesInBlack: 'yes'},
{car: "Citroen C4 Coupe", year: 2008, available: false, comesInBlack: 'yes'},
{car: "Audi A4 Avant", year: 2011, available: true, comesInBlack: 'no'},
{car: "Opel Astra", year: 2004, available: false, comesInBlack: 'yes'},
{car: "BMW 320i Coupe", year: 2011, available: false, comesInBlack: 'no'}
];
}
var carData = getCarData();
carData.forEach(function(obj, index){
var obj = new PrependableObject(obj),
newObj = obj.prepend('check', false);
carData[index] = newObj;
});
// To prove the keys are in the correct order
var car1 = carData[0];
Object.keys(car1).forEach(function(key, i){
console.log(key + ' = ' + car1[key]);
});
已更新fiddle:
http://jsfiddle.net/juo1e4at/4/
当然,您的 forEach
循环中的逻辑可以做任何事情(例如,使用汽车模型来确定要分配给对象的动态值、汽车年份等)。
Javascript 对象中属性的顺序无关紧要,它们的顺序并不严格。
鉴于
var cars = [
{car: "Mercedes A 160", year: 2006, available: true, comesInBlack: 'yes'},
{car: "Citroen C4 Coupe", year: 2008, available: false, comesInBlack: 'yes'},
{car: "Audi A4 Avant", year: 2011, available: true, comesInBlack: 'no'},
{car: "Opel Astra", year: 2004, available: false, comesInBlack: 'yes'},
{car: "BMW 320i Coupe", year: 2011, available: false, comesInBlack: 'no'}
];
如果您没有属性准备好从后端发送或出于其他原因(较小的负载大小等)想在前端发送,您可以简单地执行以下操作。
for (i in cars) {
cars[i].checkbox = false;
}
现在回到Handsontable列顺序的问题(其实是本题的主要问题),可以这样定义:
var hot = new Handsontable(container,{
data: cars,
/* Other config */
columns: [
{data: "checkbox", type: 'checkbox'},
{data: "car", type: 'text'}
/*Other columns*/
]
});
有关详细信息,请参阅 the manual。