设置属性名称为动态的属性的值,AND包含“。”

时间:2015-06-29 10:33:33

标签: javascript

我有一些代码可以处理来自服务器的一组数据。

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对象。

假设fieldsdata来自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?不幸的是,我没有控制服务器端,我最终将此结果传递给第三方组件,我也无法更改。

1 个答案:

答案 0 :(得分:1)

用以下代码替换迭代解决方案:

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是姓氏数组中的索引。当您设置这样的值时,您将维护对象结构。