JavaScriptでオブジェクトをループさせたいと思った時は Object.keys でキーだけ配列にしたものを
Array.forEach で回すっていうのが鉄板だったが、
ES2017の Object.entries の方が見た目エレガントやなあと思った。
Object.entries は key:value のペア1つずつを配列化してくれるので、
{ 'nyan': 'cat', 'wan': 'dog' }
が、
[ ['nyan', 'cat'], ['wan', 'dog'] ]
こうなる。
Array.forEachすると値取り出すのにindex使わなアカンやん…ってなるが、
Object.entries({ 'nyan': 'cat', 'wan': 'dog' }).forEach( dat => {
console.log(dat[0]) //'nyan'
console.log(dat[1]) //'cat'
} )
分割代入使えば大変わかりやすい。
Object.entries({ 'nyan': 'cat', 'wan': 'dog' }).forEach(([key, val]) => {
console.log(key) //'nyan'
console.log(val) //'cat'
} )
Object.keysでArray.forEachの場合:
let data = { 'nyan': 'cat', 'wan': 'dog' };
Object.keys(data).forEach( key => {
console.log(key) //'nyan'
console.log(data[key]) //'cat'
}, data)
値へのアクセスが data[key] になる。
これで簡易テンプレート作ったサンプル:
let data = {
date: '2018/08/14',
title: 'Hello World',
content: 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.'
}
let template = '<div class="sample"><p class="meta"><time><%date%></time><strong class="title"><%title%></strong></p><p class="content"><%content%></p></div>';
Object.entries(data).forEach( ([key, val]) => {
template = template.replace(new RegExp('<%' + key + '%>', 'igm'), val);
})
console.log(template)
See the Pen A simple JS template using Object.entries by Tenderfeel (@Tenderfeel) on CodePen.
ES6のテンプレート文字列を使うと、
`<div class="sample"><p class="meta"><time>${data.date}</time><strong class="title">${data.title}</strong></p><p class="content">${data.content}</p></div>`
まさにテンプレートな趣があって便利だけど、
このテンプレート部分を使いまわそうとするなら関数にしないとエラーになる。
const template = (html, data) => {
return html + `<div class="sample"><p class="meta"><time>${data.date}</time><strong class="title">${data.title}</strong></p><p class="content">${data.content}</p></div>`;
}
document.body.innerHTML = data.reduce(template, '');
See the Pen ES6 Template Strings Sample by Tenderfeel (@Tenderfeel) on CodePen.
なにかライブラリ的なものでテンプレートを変更できるようにするなら、(使う人によりけりだけど)単なる文字列である方が扱いやすいと思う。