从数组中的 JSON 对象中获取记录

Fetching records from inside a JSON Object inside an Array

我有一个 API 回复采用这种格式。

 [{
 "response_data": {
    "0":{
    "id" : 0,
    "office" : "India",
    "type" : 'Perm'
    },
    "1":{
    id : 0,
    "office" : "America",
    "type" : 'Perm'
    },
    "2":{
    id : 0,
    "office" : "Europe",
    "type" : 'Contract'
    },
    "2":{
    id : 0,
    "office" : "Latin America",
    "type" : 'Contract'
    }

    }}]

我正在尝试获取所有 office,其中 typeContract。我将 json 响应保存在一个变量中,例如 - 使用 Chakram as

var response_json = t.body[0].response_data;

这在 console.log 中给了我正确的响应

       "0":{
    "id" : 0,
    "office" : "India",
    "type" : 'Perm'
    },
    "1":{
    id : 0,
    "office" : "America",
    "type" : 'Perm'
    },
    "2":{
    id : 0,
    "office" : "Europe",
    "type" : 'Contract'
    },
    "2":{
    id : 0,
    "office" : "Latin America",
    "type" : 'Contract'
    }

现在如何获取json中的相应键并提取所需信息。我试过了,但是 returns undefined

var length = Object.keys(response_json).length;
for(var i = 0; i<= length;i++){
console.log(response_json.i) //returns undefined
 console.log((Object.keys(response_json)).id); //returns undefined.
}

我知道如果响应是一个数组,这可以使用 filter 方法解决,但是我如何在 JSON 对象中执行相同的操作?我正在寻找优化的解决方案,因为 API returns 将近 5000 个对象。 如果已经有人问过这个问题,请提供参考,因为我在 SO 上找不到任何参考。

您的代码有两个主要错误,一个是使用 loop 直到 array 的长度,其中索引从 0 开始。第二个是使用方括号而不是 dot。所以更新代码如下:

var keys = Object.keys(response_json);
var length = keys .length;
for(var i = 0; i< length;i++){
   console.log(response_json[keys[i]]);
}

如果你想用过滤方法做到这一点,那么 解决方法是添加 属性 长度,然后使用 Array.from,如下所示。然后你可以使用Array.prototype.filter方法。

let o = {
    '0': {
        id: 0,
        "office": "India",
        "type": 'Perm'
    },
    '1': {
        id: 0,
        "office": "America",
        "type": 'Perm'
    },
    '2': {
        id: 0,
        "office": "Europe",
        "type": 'Contract'
    }
};

o.length = Object.keys(o).length;
let a = Array.from(o);

let r = a.filter(({ type }) => type == 'Contract');
console.log(r);

在您的 response_json '0' 和 '1' 上,所有键均为字符串格式。 但是在您的 for 循环中 'i' 是整数,因此密钥不可用。只需将其转换为字符串即可获得所需的结果 像 console.log(response_json[''+i])

 var data =  [{"response_data": {
    '0':{id : 0, "office" : "India", "type" : 'Perm'},
    '1':{id : 0, "office" : "America","type" : 'Perm'},
    '2':{ id : 0, "office" : "Europe","type" : 'Contract'},
    '3':{ id : 0, "office" : "Latin America", "type" : 'Contract'}
    }}];

 var list = data[0]['response_data'];
    var filterList = [];
    for(var i in list) {
        if(list.hasOwnProperty(i)) {
            var type = list[i]['type'];
            if(type === 'Contract') {
                filterList.push(list[i]);
            }
        }
    }

如果记录超过 5000 条,javascript 可能不会更好,最好在服务器端处理。