如何通过密钥映射json以进行此类API响应

时间:2017-06-30 18:52:55

标签: javascript jquery angularjs arrays json

这就是API响应的样子。

{
"keys": ["CustomerId", "Name", "Gender"],
"value": [["1", "Ram", "Male"]]
}

Angular VM

function Customer(){
 return this.Customer = {
      "CustId": "",
      "Name": "",
      "Gender": "",
 }
}

Angular AJAX Call。

$http.get(url)
        .then(function(data)){
          var cust = new Customer();
          //for now I am doing this way.
           cust.Id = data.value[0][0];
           cust.Name = data.value[0][1];
           cust.Gender = data.value[0][1];

        }

我不想按索引映射属性。

这些API不在我的掌控之中
有没有办法,我可以按键(响应)映射属性,如下所示。

           cust.Id = data.value[0]["CustomerId"];
           cust.Name = data.value[0]["Name"];
           cust.Gender = data.value[0]["Gender"];

任何帮助/建议都非常感谢。

2 个答案:

答案 0 :(得分:2)

我能看到实现这样的事情的唯一方法是找到每个键的索引,并在访问你的值时使用它作为索引:

$http.get(url)
    .then(function(data){
        var cust = new Customer();

        cust.Id = data.value[0][data.keys.indexOf('CustomerId')];
        cust.Name = data.value[0][data.keys.indexOf('Name')];
        cust.Gender = data.value[0][data.keys.indexOf('Gender')];
    });

但是请注意,这只有在键和值匹配时才有效...我认为它们会匹配。

答案 1 :(得分:1)

如果你能够使用ES6,那么最好的解决方法(对于这个制作简单的API)就是创建一个像这样的解析器函数:

function parseResponse(response) {
    const {keys, value: objects} = response;

    return objects.map(object => {
        const parsedValue = {};

        keys.forEach((key, index) => {
            parsedValue[key] = object[index];
        });

        return parsedValue;
    });
}

试验:

const response = {
    "keys": ["CustomerId", "Name", "Gender"],
    "value": [["1", "Ram", "Male"]]
};

parseResponse(response); // Outputs [{CustomerId: "1", Name: "Ram", Gender: "Male"}]

如果你愿意,我可以用ES5做到这一点。只要说出这个词:)

修改

ES5版本:

function parseResponse(response) {
    var keys = response.keys;
    var objects = response.value;
    var response = [];

    for (let i = 0; i < objects.length; i++) {
        var formattedValue = {};

        for (let j = 0; j < keys.length; j++) {
            var key = keys[j];
            formattedValue[key] = objects[i][j];
        }

        response.push(formattedValue);
    }

    return response;
}