扩展JSON结果以将JavaScript函数添加到每个JS对象

时间:2014-11-07 05:04:43

标签: javascript json

我想知道是否有办法做到这一点,或者如果我走错了路,并且有更好的方法来做到这一点。

所以我从服务器返回的一些数据看起来像这样:

[{
  fieldId: 12,
  name: 'Client',
  provider: 'CompanyDataQuery'
},{
  fieldId: 11,
  name: 'Duration',
  provider: null
},{
  fieldId: 24,
  name: 'Brand',
  provider: 'BrandDataQuery'
}]

现在,每个这些对象都需要附加一个函数,该函数指示一组单独的数据应该如何与之交互。

例如,我有类似的东西:

{
  "$type": "EqualsExpression",
  "left": {
    "$type": "FieldNode",
    "fieldId": 12
  },
  "right": {
    "$type": "CompanyNode",
    "value": 829
  }
}

我想看看左边的'表达式并获取值' 12',从第一个列表中找到相应的字段,然后向它询问数据。

var field = fields.find(node.left.fieldId);
var displayValue = field.getDisplayValue(node.right.value);

所以我想在字段中添加一个函数,如:

{
  fieldId: 12,
  name: 'Client',
  provider: 'CompanyDataQuery',
  getDisplayValue: function(rightValue) {
     // Look up data based on CompanyDataQuery

     return companyDataQuery[rightValue].name;
  }
}

我知道这些功能的实现。但我不确定如何干净地扩展原始对象以包含此功能。

我是否应该迭代这些并根据需要分配函数或为每个字段创建一个包装器......或者有更好的方法吗?

我想要避免的是创建一个充满if语句的巨型函数来分配或决定调用哪些函数。

1 个答案:

答案 0 :(得分:1)

我建议使用一个提供函数的包装器对象并保留数据...你可以使它与Backbone非常相似,以保持一组共同的模式。

从包装器对象本身开始:


var MyThing = function(data){
  this.data = data;
}

MyThing.prototype.doTheStuff = function(){
  // code to get the field data, and other data, here
};

MyThing.prototype.get = function(name){
  return this.data[name];
};

获取数据时,__将其映射到包装器对象


var listOfThingData = [ ... your list of things ... ];

var listOfThings = _.map(listOfThingData, function(thingData){
  return new MyThing(thingData);
});

此时,您有一个对象数组,每个对象都有doTheStuff方法。

var obj = listOfThings[0];
obj.doTheStuff();
obj.get("fieldId");
// etc.

从这里开始,您可能需要一个循环遍历数组并按id查找对象的方法。我会在数组周围创建一个包装器。


var MyCollectionOfThings = function(things){
  this.things = things;
};

MyCollectionOfThings.prototype.get = function(id){
  var things = _.findWhere(this.things, {fieldId: id});
  // only return one of them, since it's by id
  if (things){ return things[0] };
};

这里会有更多的代码......但是我希望这可以解决问题。

此外,此时你已经接近Backbone&#39的集合和模型的一半:)