Object.entries()
と Object.values()
この章では、Jordan Harband 氏による ECMAScript 2017 の機能「Object.values/Object.entries」について説明します。
Object.entries()
let
obj
=
{
one
:
1
,
two
:
2
};
for
(
let
[
k
,
v
]
of
Object
.
entries
(
obj
))
{
console
.
log
(
`
${
JSON
.
stringify
(
k
)
}
:
${
JSON
.
stringify
(
v
)
}
`
);
}
// Output:
// "one": 1
// "two": 2
Object.values()
> Object.values({ one: 1, two: 2 })
[ 1, 2 ]
Object.entries()
このメソッドには次のシグネチャがあります。
Object
.
entries
(
value
:
any
)
:
Array
<
[
string
,
any
]
>
JavaScript データ構造に key と値がある場合、エントリはキー-値ペアで、2 要素配列としてエンコードされます。Object.entries(x)
は x
をオブジェクトに変換し、配列に含まれる列挙可能な独自文字列キー付きプロパティのエントリを返します。
> Object.entries({ one: 1, two: 2 })
[ [ 'one', 1 ], [ 'two', 2 ] ]
キーがシンボルのプロパティは無視されます。
>
Object
.
entries
(
{
[
Symbol
()
]
:
123,
foo
:
'abc'
}
);
[
[
'foo'
,
'abc'
]
]
Object.entries()
は、オブジェクトのプロパティを反復処理する方法を最終的に提供します (オブジェクトがデフォルトで反復可能でない理由については、こちらをお読みください).
let
obj
=
{
one
:
1
,
two
:
2
};
for
(
let
[
k
,
v
]
of
Object
.
entries
(
obj
))
{
console
.
log
(
`
${
JSON
.
stringify
(
k
)
}
:
${
JSON
.
stringify
(
v
)
}
`
);
}
// Output:
// "one": 1
// "two": 2
Object.entries()
を使用してマップを設定する Object.entries()
では、オブジェクトを使用して Map を設定することもできます。これにより 2 要素配列の配列を使用する場合よりも簡潔になりますが、キーは文字列のみです。
let
map
=
new
Map
(
Object
.
entries
({
one
:
1
,
two
:
2
,
}));
console
.
log
(
JSON
.
stringify
([...
map
]));
// [["one",1],["two",2]]
Object.entries()
Object.entries()
の戻り値が配列であり、イテレーターではないのはなぜですか?Object.keys()
であり、Map.prototype.entries()
などではありません。Object.entries()
が列挙可能な独自の文字列キー付きプロパティのみを返すのはなぜですか?Object.keys()
と整合性を保つためです。そのメソッドもキーがシンボルのプロパティを無視します。最終的に、すべての独自のプロパティを返す Reflect.ownEntries()
メソッドが登場する可能性があります。Object.values()
Object.values()
には次のシグネチャがあります。
Object
.
values
(
value
:
any
)
:
Array
<
any
>
これは Object.entries()
のように機能しますが、その名前が示すように、独自の列挙可能な文字列キー付きプロパティの値のみを返します。
> Object.values({ one: 1, two: 2 })
[ 1, 2 ]