设置属性的值,其中属性名称是动态的,AND包含一个''
Set value of a property where the property name is dynamic, AND contains a '.'
我有一些代码可以处理来自服务器的一组数据。
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
是姓氏数组中的索引。这样设置值时,可以保持对象结构。
相关文章:
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- Angularjs应用程序中使用AND运算过滤ng个基于重复的多个属性
- 通过javascript中的逻辑AND运算按多个属性进行筛选
- 在Javascript中使用变量访问对象的AND属性
- AngularJS控制器的Unittest with Jasmine and Karma "无法读取属性
- 删除<选项>当自定义属性不等于x时,由.class AND执行
- 设置属性的值,其中属性名称是动态的,AND包含一个''