1、定义
Object.entries()
方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in
循环遍历该对象时返回的顺序一致(区别在于 for-in
循环还会枚举原型链中的属性)。
语法
Object.entries(obj)
参数
obj 可以返回其可枚举属性的键值对的对象。
返回值
给定对象自身可枚举属性的键值对数组。
描述
Object.entries()
返回一个数组
,其元素是与直接在object
上找到的可枚举属性键值对相对应的数组
。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。
2、使用示例
const object = {
a: 'string',
b: 111,
c: true,
e: null,
d: undefined,
f: [3, 4, 5],
g: { obj: '666' }
};
for (const [key, value] of Object.entries(object)) {
console.log(`${key}: ${value}`);
}
// expected output:
// a: string
// b: 111
// c: true
// e: null
// d: undefined
// f: 3,4,5
// g: [object Object]
console.log(Object.entries(object));
// 正常对象枚举
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
// key为索引的对象
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]
// key是数字类型,会按照从小到大枚举
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]
// getFoo是不可枚举的属性
const myObj = Object.create({}, { getFoo: { value() { return this.foo; } } });
myObj.foo = 'bar';
console.log(Object.entries(myObj)); // [ ['foo', 'bar'] ]
// 非对象参数将被强制为对象
console.log(Object.entries('foo')); // [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]
// 通过 for...of 方式遍历键值
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}
// forEach 方法遍历
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});
// 将 Object 转换为 Map
// new Map() 构造函数接受一个可迭代的entries。借助Object.entries方法你可以很容易的将Object转换为Map:
const obj = { foo: "bar", baz: 42 };
const map = new Map(Object.entries(obj));
console.log(map); // Map(2) { "foo" => "bar", "baz" => 42 }
// 将 Map 转换为 Object
const objByMap = Object.fromEntries(map);
console.log(objByMap); // { foo: 'bar', baz: 42 }
// 获取 url 传参
const str = "page=1&&row=10&&id=2&&name=test"
const params = new URLSearchParams(str)
console.log(Object.fromEntries(params)) // { page: '1', row: '10', id: '2', name: 'test' }
3、实现
const entries = arg => {
if (Array.isArray(arg)) return arg.map((x, index) => [`${index}`, x]);
if (Object.prototype.toString.call(arg) === `[object Object]`) return Object.keys(arg).map(y => [y, arg[y]]);
if (typeof arg === 'number') return [];
throw '无法将参数转换为对象!'
}
// test Number
console.log(entries(1)); // []
// test Object
const obj = { foo: "bar", baz: 42 };
const map = new Map(entries(obj));
console.log(map); // Map(2) { "foo" => "bar", "baz" => 42 }
// test Array
const arr = [1, 2, 3];
console.log(entries(arr)); // [["0", 1], ["1", 2], ["2", 3]]
// test Error
console.log(entries('123')); // 无法将参数转换为对象!
const fromEntries = arg => {
// Map
if (Object.prototype.toString.call(arg) === '[object Map]') {
const resMap = {};
for (const key of arg.keys()) resMap[key] = arg.get(key);
return resMap;
}
// Array
if (Array.isArray(arg)) {
const resArr = {}
arg.map(([key, value]) => resArr[key] = value);
return resArr
}
throw '参数不可编辑!';
}
// test Map
const map = new Map(Object.entries({ foo: "bar", baz: 42 }));
const obj = fromEntries(map);
console.log(obj); // { foo: 'bar', baz: 42 }
// test Array
const arr = [['0', 'a'], ['1', 'b'], ['2', 'c']];
const obj = fromEntries(arr);
console.log(obj); // { 0: 'a', 1: 'b', 2: 'c' }
// test Error
console.log(fromEntries(1)); // 参数不可编辑!