如何打印嵌套对象的所有值

时间:2015-04-08 13:32:44

标签: javascript jquery

有一个像这样的嵌套对象:

var conversation = {
    'John': {
        1: 'Test message 1',
        2: 'Test message 2',
        'Reply': {
            3: 'Test message 3',
            4: 'Test message 4'
        }
    },
    'Jack': {
        5: 'Test message 5',
        6: 'Test message 6'
    }
};

我需要获取所有最终值,因此对于该示例,它是:

Test message 1
Test message 2
Test message 3
Test message 4
Test message 5
Test message 6

如何迭代对象? jQuery或JavaScript中是否有内置函数?

3 个答案:

答案 0 :(得分:19)

你可以使用一些递归来检查被迭代的键是否是一个对象,然后打印:

function printValues(obj) {
    for (var key in obj) {
        if (typeof obj[key] === "object") {
            printValues(obj[key]);   
        } else {
            console.log(obj[key]);    
        }
    }
}

printValues(conversation);

演示:http://jsfiddle.net/c7th1t8r/

答案 1 :(得分:3)

jQuery有你可以使用的each函数,除了一些递归到你的对象之前,直到你得到你可以打印的东西。

var conversation = {
  'John': {
    1: 'Test message 1',
    2: 'Test message 2',
    'Reply': {
      3: 'Test message 3',
      4: 'Test message 4'
    }
  },
  'Jack': {
    5: 'Test message 5',
    6: 'Test message 6'
  }
};

function iterate(obj) {
  if (typeof obj === 'string') {
    $('#log').append((obj + '<br/>'));
  }
  if (typeof obj === 'object') {
    $.each(obj, function(key, value) {
      iterate(value);
    });
  }
}

iterate(conversation);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>

答案 2 :(得分:2)

更实用的方法:

const getObjectValues = (obj) => (obj && typeof obj === 'object')
 ? Object.values(obj).map(getObjectValues).flat()
 : [obj]

这将返回一个可以打印的数组:

console.log(getObjectValues(conversation))
// ["Test message 1", "Test message 2", "Test message 3", "Test message 4", "Test message 5", "Test message 6"]

编辑:

如果Array.flat在您的上下文中不可用,则可以这样写:

const getObjValues = (obj) => (obj && typeof obj === 'object')
  ? Object
    .values(obj)
    .map(getObjValues)
    .reduce((a, b) => a.concat(b), [])
  : [obj]