javascript にて Object を forEach で参照する

昔は underscore や lodash などを使って配列やオブジェクトを扱っていたけど、
最近はネイティブで色々と便利なメソッドが用意されてきたので、
Vanilla JS で Object を forEach を使って参照してみる。

サンプルコード

Object 型は forEach() を持っていないので注意。

Object.keys() を使うとオブジェクトのキーを配列で取得できる。
ただし、配列で取得できるのは最初の階層だけなので、
オブジェクトの中にあるオブジェクトは取得できない。

const obj = {
	id: 0,
	name: 'psychedelic nekopunch',
	address: 'Tokyo',
	sex: 'male',
	marks: {
		japanese: 'D',
		science: 'C',
		math: 'A',
		physical: 'A',
		english: {
			reading: 'B',
			writing: 'C',
			speaking: 'A',
		}
	},
}

const keys = Object.keys(obj)

keys.forEach((key) => {
	console.log(`${key}: ${obj[key]}`)
	// id: 1
	// name: psychedelic nekopunch
	// address: Tokyo
	// sex: male
	// marks: [object Object]
})

// 再帰的に取得する
function reflexiveCall(obj, nest) {
	const keys = Object.keys(obj)
	keys.forEach((key) => {
		if (typeof obj[key] == 'object') {
			if (nest) {
				reflexiveCall(obj[key], `${nest}${key}.`)
			} else {
				reflexiveCall(obj[key], `${key}.`)
			}
			return
		}
		if (nest) {
			console.log(`${nest}${key}: ${obj[key]}`)
		} else {
			console.log(`${key}: ${obj[key]}`)
		}
		// id: 1
		// name. psychedelic nekopunch
		// address: Tokyo
		// sex: male
		// marks.japanese: D
		// marks.science: C
		// marks.math: A
		// marks.physical: A
		// marks.english.reading: B
		// marks.english.writing: C
		// marks.english.speaking: A
	})
}

reflexiveCall(obj, '')