在不知道名称的情况下访问 json 对象内的元素

Access elements inside json object without knowing names

我在 node.js 中有以下 json 对象。

x={
    '40': {
        length: '2',
        data: ['11', '22']
    },
    '41': {
        length: '1',
        data: ['fe']
    },
    '42': {
        length: '2',
        data: ['ef', 'ab']
    },  
}

假设我事先不知道 x 中的 属性 名称是什么。但是,我想检索每个 属性 及其相关值。如何才能做到这一点?

我正在使用node.js

您可以使用 Object.keys():

Object.keys(x).forEach(v => {
    console.log(v);  // logs the key
    console.log(x[v])  // logs the key's value
})

首先,那不是 JSON。那是一个 JavaScript 对象初始值设定项。 JSON 是一种 文本 表示法。如果你处理的是 JavaScript 源代码,而不是 字符串 ,你就不是在处理 JSON。 (如果 字符串,它将无效 JSON;JSON 要求键和字符串用双引号引起来,而不是单引号。)

您可以找出 x 对象中的键正在使用 for-inObject.keys:

for-in:

var key;
for (key in x) {
    // key is the key
    // x[key] is the value
}

使用最新的 NodeJS,您可以使用 JavaScript 的新 letkey 限制在循环中:

for (let key in x) {
    // key is the key
    // x[key] is the value
}

Object.keys:

Object.keys(x).forEach(function(key) {
    // key is the key
    // x[key] is the value
});

在最新版本的 NodeJS 中,您可以使用 JavaScript 的新 箭头函数 作为回调函数,使事情变得更简洁:

Object.keys(x).forEach(key => {
    // key is the key
    // x[key] is the value
});

如果您需要深入到 x 包含的对象,您只需递归即可。

请注意,for-in 将访问对象的 可枚举属性 ,包括其原型上的任何可枚举属性。 Object.keys 将为您提供对象 自己的可枚举属性的数组 (仅限)。

forEach的例子:

var x = {
    '40': {
        length: '2',
        data: ['11', '22']
    },
    '41': {
        length: '1',
        data: ['fe']
    },
    '42': {
        length: '2',
        data: ['ef', 'ab']
    },  
};
Object.keys(x).forEach(function(key) {
    console.log(key + ": length = " + x[key].length);
});

优化安迪的代码

var x = {
        '40': {
            length: '2',
            data: ['11', '22']
        },
        '41': {
            length: '1',
            data: ['fe']
        },
        '42': {
            length: '2',
            data: ['ef', 'ab']
        },  
    };



function finder(obj) {
   
  if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {

    for (var p in obj) {
        console.log('key: ' + p + ', type: object');
        finder(obj[p]);
     } 
  } else {
      console.log('key: ' + obj + ', value: ', obj);
  }
  
}

finder(x);

使用递归查找所有对象的 key/values 嵌套或其他:

function finder(obj) {

  // for each property in the object passed into
  // the function...
  for (var p in obj) {

    // if its value is another object (see appended note)...
    if (Object.prototype.toString.call(obj[p]).slice(8, -1) === 'Object') {

      // ...log the key to the console and then call finder()
      // again with this current object (this is the recursive part)
      console.log('key: ' + p + ', value: Object');
      finder(obj[p]);

    // otherwise log the key/value
    } else {
      console.log('key: ' + p + ', value: ', obj[p]);
    }
  }
}

finder(x);

输出

key: 40, value: Object
key: length, value:  2
key: data, value:  Array [ "11", "22" ]
key: 41, value: Object
key: length, value:  1
key: data, value:  Array [ "fe" ]
key: 42, value: Object
key: length, value:  2
key: data, value:  Array [ "ef", "ab" ]

注意

这行相当冗长的代码用于检查一个值是否是一个对象

Object.prototype.toString.call(obj[p]).slice(8, -1) === 'Object'

是必需的,因为 typeof obj[p] === 'object' 将 return true 用于数组,null 也是。这有点棘手。

Object.prototype.toString.call({})

return 是一个类似于 "[object Object]" 的字符串,slice 抓取字符串的相关部分。