我有一些代码可以处理来自服务器的一组数据。
var data = [
{ Id: 1, Opened: false, Message: {
{ Subject: 'A message', Body: '....', Date: '2015-06-21T17:35:15' },
},
{ Id: 2, Opened: true, Message: {
{ Subject: 'A message', Body: '....', Date: '2015-05-21T17:35:15' },
}
];
我不知道日期将位于属性 Message.Date
下,因为它取决于服务器返回的内容。但是,我将始终拥有数据项字段的列表。使用这个例子,我会得到这样的东西:
var fields = [
{id: 1, name: 'Field', type: 'varchar'},
{id: 2, name: 'Opened', type: 'bool'},
{id: 3, name: 'Message.Subject', type: 'varchar'},
{id: 4, name: 'Message.Body', type: 'varchar'},
{id: 5, name: 'Message.Date', type: 'date'},
];
我想将 Date 属性转换为 Date 对象。
假设fields
和data
来自AJAX调用的结果,那么我的代码看起来像这样......:
$.each(response.fields, function(idx,field){
var dataItems = response.data;
$.each(dataItems, function(rowIdx, rowItem){
if(field.type == 'date'){
dataItems[rowIdx][field.name] = new Date(dataItems[rowIdx][field.name]);
}
});
});
这不起作用,因为我最终尝试访问对象的名为“Message.Date”的属性,而不是对象的“Message”属性的“Date”属性。
到目前为止我一直在做这样的事情来处理它:
var date = dataItems[rowIdx];
var fieldPropertyLabelSplit = field.propertyLabel.split('.');
for (var i = 0; i < fieldPropertyLabelSplit.length; ++i) {
date = date[fieldPropertyLabelSplit[i]];
}
dataItems[rIdx][field.propertyLabel] = new Date(date);
这样,new Date(date)
就可以了,但我最终得到的是 A 而不是 B...:
A: B:
{ Message.Date: _date_ }; { Message: { Date: _date _ }};
我发现让它按我想要的方式工作的唯一方法是使用eval
...
var pN = 'dataItems[rIdx]';
for (var i = 0; i < fieldPropertyLabelSplit.length; ++i) {
pN += '["' + fieldPropertyLabelSplit[i] + '"]';
}
eval(pN +'= new Date(date);');
是否有任何我错过的库或简单功能可以处理此类用例?这是 eval 的正确使用吗?不幸的是,我无法控制服务器端,并且最终将这个结果传递给我也无法更改的第三方组件。
最佳答案
将迭代解决方案替换为:
var date = dataItems[rowIdx];
var fieldPropertyLabelSplit = field.propertyLabel.split('.');
for (var i = 0; i < fieldPropertyLabelSplit.length - 1; ++i) {
date = date[fieldPropertyLabelSplit[i]];
}
date[fieldPropertyLabelSplit[i]] = new Date(date[fieldPropertyLabelSplit[i]]);
这样,date
就指向实际值之前的最后一个对象,i
是姓氏数组中的索引。当您像这样设置值时,您可以维护对象结构。
关于javascript - 设置属性名称为动态且包含 '.' 的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31113467/