繁体   English   中英

如何通过密钥映射JSON以获取此类API响应

[英]How to map the json by key for such API response

这就是API响应的样子。

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

角度虚拟机

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

角AJAX调用。

$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"];

任何帮助/建议高度赞赏。

我能看到的达到这种目的的唯一方法是找到每个键的索引,并在访问这样的值时将其用作索引:

$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')];
    });

但是请注意,这仅在键和值匹配时才起作用...我认为它们会匹配。

如果您能够使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM