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

时间:2016-03-16 09:05:11

标签: javascript json node.js javascript-objects

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

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

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

我正在使用node.js

4 个答案:

答案 0 :(得分:3)

首先,那不是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的新let来保持key仅限于循环:

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的新箭头功能作为callbck,以使事情更简洁:

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) {
  snippet.log(key + ": length = " + x[key].length);
});

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

使用递归来查找嵌套的所有对象的键/值:

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'将为数组和true返回null。这有点儿了。

Object.prototype.toString.call({})

返回类似"[object Object]"的字符串,slice抓取字符串的相关部分。

答案 2 :(得分:0)

您可以使用Object.keys()

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

答案 3 :(得分:-1)

优化安迪的代码

&#13;
&#13;
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);
&#13;
&#13;
&#13;