【问题标题】:How to map the json by key for such API response如何为此类 API 响应按键映射 json
【发布时间】:2017-12-04 19:23:16
【问题描述】:

这就是 API 响应的样子。

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

角度虚拟机

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

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

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

【问题讨论】:

  • 您能否修改您的 API 响应以更好地格式化 JSON?这不是一个高质量的结构化响应。
  • @Brant,希望我能。但这不在我的控制范围内

标签: javascript jquery angularjs arrays json


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!!现在真的很有用,会接受它(让我们看看是否有人有其他方法)
【解决方案2】:

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

【讨论】:

  • 谢谢伙计,是的,请务必使用 ES 5,并将其保留在帖子中。
  • 是的,当然。编辑了我的答案:) 请不要忘记投票!
猜你喜欢
  • 2021-11-24
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多