如何在JSON对象中获取所有键(javascript)

42
{"document":
  {"people":[
    {"name":["Harry Potter"],"age":["18"],"gender":["Male"]},
    {"name":["hermione granger"],"age":["18"],"gender":["Female"]},
  ]}
}
从这个JSON示例中,我想获取每个人的诸如nameagegender之类的键。
如何做到这一点?

12
你的 JSON 结构不正确。姓名、年龄和性别应该是单个属性,而不是列表。应该是 {"name": "Harry Potter", "age":"18", "gender":"Male"}(没有方括号)。 - nbrooks
这与JSON无关,JSON只是一种文本格式。 - Heretic Monkey
7个回答

91

我使用 JavaScript Object 内置的 Object.keys 方法,它会返回给定对象的键的数组。MDN 参考文档

var obj = {name: "Jeeva", age: "22", gender: "Male"}
console.log(Object.keys(obj))

2
这不是被要求的正确解决方案。你所做的只是简化问题并解决它,这对于没有任何帮助。 - Mikkel
2
哦,抱歉,我还不太擅长回答问题。下次我会记住的。 - Jeeva
2
就此而言:被接受的解决方案也没有回答这个问题。 - acidjunk

51

试试这个

var s = {name: "raul", age: "22", gender: "Male"}
   var keys = [];
   for(var k in s) keys.push(k);

在这里,keys数组将返回您的键["name", "age", "gender"]


1
我们能否有一个通用的解决方案,就像这样工作:var object3 = { parent1: 42, parent2: [13, 12, { 'child1': 222 }], parent3: { child1: 44, child2: "ok", child3: [44, 45, 47, 48] }, parent4: { child1: 444 } }; - Shubhendu Vaid
1
我们如何返回嵌套对象和数组中的所有键? 例如从以下数据中获取所有键: "data":{ "user":{ "id": 1, "name": "xyz" }, "address":[ "street":"xyz", "location: "xxx"] } - Nisrine Bou Ghannam
1
@NisrineBouGhannam 你是否解决了这个问题,我也很想知道。 - Todd Brannon

18
var input = {"document":
  {"people":[
    {"name":["Harry Potter"],"age":["18"],"gender":["Male"]},
    {"name":["hermione granger"],"age":["18"],"gender":["Female"]},
  ]}
}

var keys = [];
for(var i = 0;i<input.document.people.length;i++)
{
    Object.keys(input.document.people[i]).forEach(function(key){
        if(keys.indexOf(key) == -1)
        {
            keys.push(key);
        }
    });
}
console.log(keys);

如果people是一个空数组,那么可能会出现在非对象上调用Object.keys的错误。 - vp_arth
我认为你的第一个版本是最佳答案,只需要检查数组不为空即可。当前版本太复杂了 :) - vp_arth
1
这是一个很好的解决方案,可以防止相同的键被添加多次。 - nbrooks
@vp_arth 实际上,这只适用于数组中的第一个项目,如果第二个或第三个对象有一些额外的属性,比如“地址”,它将会失败。 - BatScream
这是另一个任务,具有其他条件,可能需要仅获取所有实体的公共字段。 - vp_arth
即使是识别常见字段,我们也需要迭代数组中的所有对象,因此我认为这将是一个更好的解决方案。 - BatScream

8
今天的ES6内容如下:
const json_getAllKeys = data => (
  data.reduce((keys, obj) => (
    keys.concat(Object.keys(obj).filter(key => (
      keys.indexOf(key) === -1))
    )
  ), [])
)

是的,它可以用非常长的一行来编写;

const json_getAllKeys = data => data.reduce((keys, obj) => keys.concat(Object.keys(obj).filter(key => keys.indexOf(key) === -1)), [])

编辑:如果输入的是对象数组,则返回所有第一级键。

4

这个函数应该返回一个数组,其中包含JSON对象中所有的键(即键名),包括嵌套的键/值对

function get_all_json_keys(json_object, ret_array = []) {
    for (json_key in json_object) {
        if (typeof(json_object[json_key]) === 'object' && !Array.isArray(json_object[json_key])) {
            ret_array.push(json_key);
            get_all_json_keys(json_object[json_key], ret_array);
        } else if (Array.isArray(json_object[json_key])) {
            ret_array.push(json_key);
            first_element = json_object[json_key][0];
            if (typeof(first_element) === 'object') {
                get_all_json_keys(first_element, ret_array);
            }
        } else {
            ret_array.push(json_key);
        }
    }

    return ret_array
}

在原始对象上使用此函数

const op_object =
{
    "document":{
       "people":[
          {
             "name":[
                "Harry Potter"
             ],
             "age":[
                "18"
             ],
             "gender":[
                "Male"
             ]
          },
          {
             "name":[
                "hermione granger"
             ],
             "age":[
                "18"
             ],
             "gender":[
                "Female"
             ]
          }
       ]
    }
 }

var all_keys = [];

function get_all_json_keys(json_object, ret_array = []) {
    for (json_key in json_object) {
        if (typeof(json_object[json_key]) === 'object' && !Array.isArray(json_object[json_key])) {
            ret_array.push(json_key);
            get_all_json_keys(json_object[json_key], ret_array);
        } else if (Array.isArray(json_object[json_key])) {
            ret_array.push(json_key);
            first_element = json_object[json_key][0];
            if (typeof(first_element) === 'object') {
                get_all_json_keys(first_element, ret_array);
            }
        } else {
            ret_array.push(json_key);
        }
    }

    return ret_array
}

get_all_json_keys(op_object, all_keys);

console.log(all_keys);

应该产生

[ 'document', 'people', 'name', 'age', 'gender' ]

注意:这将返回所有键名的唯一列表。


3
var jsonData = { Name: "Ricardo Vasquez", age: "46", Email: "Rickysoft@gmail.com" };

for (x in jsonData) {   
  console.log(x +" => "+ jsonData[x]);  
  alert(x +" => "+  jsonData[x]);  
  }

1
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Adrian Mole

0
我们必须“解析”我们的 jsonObject。
 console.log('{"key0":"value0", "key1":"value1"}'); 
    var jsonObject = JSON.parse('{"key0":"value0", "key1":"value1"}')
    Object.keys(jsonObject).forEach(key => { 
        console.log(jsonObject[key]); //values 
        console.log(key); //keys 
    })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接