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

how to print all values of a nested object

本文关键字:对象 嵌套 何打印 打印      更新时间:2023-09-26

有一个类似的嵌套对象:

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中有内置函数吗?

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

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/

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'
  }
};
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>

更实用的方法:

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]