使用Javascript从API响应中剥离@

时间:2014-11-20 22:46:39

标签: javascript

我正在使用api提供这样的响应:

    {
    "statuses": {
        "status": [
            {
                "@array": "true",
                "@id": "1",
                "@uri": "https://api.com/people/statuses/1",
                "name": "Member",

            ...
        ]
    }
}

我需要使用javascript来删除密钥名称中的@。例如" @ id"到" id"。我怎么能这样做?

5 个答案:

答案 0 :(得分:1)

您必须手动迭代并重命名每个键并删除给定状态下的原始属性。像

这样的东西
response.statuses.status.forEach(function(status) {
  var keys = Object.keys(status),
      keyCount = keys.length;

  for (var j = 0; j < keyCount; j++) {
    var thisKey = keys[j];

    status[thisKey.replace('@', '')] = status[thisKey];

    delete status[thisKey];
  }
});

答案 1 :(得分:1)

除了像其他人所说的那样循环键并构建一个新对象之外,你可能会变得非常疯狂并做这样的事情:

// convert to string, if not already a string response
var responseStr = JSON.stringify(myObj);

// REGEX AWAY THE STUFF
responseStr = reponseStr.replace(/@/g, "");

// convert to obj
myObj = JSON.parse(responseStr); 

虽然,如果您的任何数据中自然有@,那么它就会得到正则表达式。我知道,这太疯狂了。认为值得一提。

答案 2 :(得分:0)

function stripSymbol(obj) {
    var type = Object.prototype.toString.call(obj);
    if (type === '[object Array]') {
        for (var i = 0, len = obj.length; i < len; i++) {
            stripSymbol(obj[i]);
        }
    } else if (type == '[object Object]') {
        Object.keys(obj).forEach(function(key) {
            if (key[0] === '@') {
                var newKey = key.substr(1);
                obj[newKey] = obj[key];
                delete key;
                key = newKey;
            }
            stripSymbol(obj[key]);
        });
    }
}

stripSymbol(data);

这将以递归方式爬行并对象并删除任何键开头的“@”。

答案 3 :(得分:0)

您无法在javascript对象中重命名密钥,但您始终可以扩展响应对象。像这样的东西会起作用:

for(var i = 0; i < statuses.status.length; i++){
  var status = statuses.status[i];
  status.array = status["@array"];
  status.id = status["@id"];
  status.uri = status["@uri];
  // could also delete properties here... see below...
}

这会给你你想要的东西,虽然所有的属性与&#39; @&#39;仍然存在。您可以更进一步,删除这些属性。

delete status["@array"];
delete status["@id"];
delete status["@uri"];

我希望你能找到的是什么。如果有帮助,请告诉我!

答案 4 :(得分:-2)

首先,数组可能是任何javascript解析器的保留字,但忽略了尝试这个......

statuses.status[0].array = statuses.status[0]["@array"];
delete statuses.status[0]["@array"];

您需要执行此操作的原因是因为javascript不支持重命名密钥。