在 es6 中迭代对象并返回新对象
Iterating objects in es6 and returning new object
使用 es6 javascript 可以迭代一个对象并返回一个新对象。例如:
const people = {
'Sally': {
age: 22,
sex: 'female',
},
'John': {
age: 64,
sex: 'male',
},
'Sam': {
age: 12,
sex: 'female',
},
};
const ages = people.someEs6IteratingObjectFunction((index, person) => {
return { Object.keys(people)[index]: person.age };
});
console.log(ages); // { 'Sally': 22, 'John': 64, 'Sam': 12, }
您可以使用数组原型reduce
方法。它也适用于 es5。
const people = {
'Sally': {
age: 22,
sex: 'female',
},
'John': {
age: 64,
sex: 'male',
},
'Sam': {
age: 12,
sex: 'female',
},
};
let result = Object.keys(people).reduce(function(r, name) {
return r[name] = people[name].age, r;
}, {});
document.write(['<pre>', JSON.stringify(result, 0, 3), '</pre>'].join(''));
如果您不太关心潜在性能,可以选择:
const ages = people.reduce(
(obj, name) => Object.assign(obj, {[name]: obj[name].age}), {});
或者也许
const ages = Object.entries(people).reduce(
(obj, [name, info]) => Object.assign(obj, {[name]: info.age}), {});
或者制作一个 ES6 Map
而不是使用Object
:
const ages = new Map(Object.entries(people).map(
([name, info]) => [name, info.age])))
这里有一种方法可以做到这一点,我希望我能为此邀功劳,它来自 Axel Rauschmayer 的博客,他还有其他几篇令人惊叹的博客文章: http://www.2ality.com/2015/02/es6-iteration.html
这是一个包含以下代码的 JSBin:
function objectEntries(obj) {
let index = 0;
let propKeys = Reflect.ownKeys(obj);
return {
[Symbol.iterator]() {
return this;
},
next() {
if (index < propKeys.length) {
let key = propKeys[index];
index++;
return { value: [key, obj[key]] };
} else {
return { done: true };
}
}
};
}
let obj = { first: 'Jane', last: 'Doe' };
for (let [key,value] of objectEntries(obj)) {
console.log(`${key}: ${value}`);
}
如果您使用生成器,这甚至更容易: http://www.2ality.com/2015/03/es6-generators.html
不幸的是,ES6 中的对象没有等效的Array.map
。
也许你可以做一个帮助程序函数来模拟这一点。它将遍历您的对象,使用每个键的值调用该键的回调,并将该值替换为回调返回的任何值。像这样:
const objectMap = (obj, cb) =>
Object.keys(obj).reduce((ppl, k) =>
Object.assign(ppl, {
[k]: cb(obj[k])
}), {}
);
然后像这样使用它:
const newPeople = objectMap(people, val => val.age);
console.log(newPeople); // Object {Sally: 22, John: 64, Sam: 12}
运行示例:
const people = {
'Sally': {
age: 22,
sex: 'female',
},
'John': {
age: 64,
sex: 'male',
},
'Sam': {
age: 12,
sex: 'female',
},
};
const objectMap = (obj, cb) =>
Object
.keys(obj)
.reduce(
(ppl, k) =>
Object.assign(ppl, {
[k]: cb(obj[k])
}), {}
);
const newPeople = objectMap(people, val => val.age);
console.log('---- People ----');
console.dir(people);
console.log('---- New People ---- ');
console.dir(newPeople);
也许你可以使用for...of
?
const people = { 'Sally': { age: 22, sex: 'female', }, 'John': { age: 64, sex: 'male', }, 'Sam': { age: 12, sex: 'female', },
};
const ages = {};
for(let index of people) {
ages[key] = people[key].age;
}
console.log(ages); // { 'Sally': 22, 'John': 64, 'Sam': 12, }
相关文章:
- 查找关键字并创建新对象
- 创建新对象时,为什么要更新旧对象
- 为什么要使用立即调用的函数来创建新对象
- 剑道网格-插入具有外部列的新对象失败
- 将原型调用为新对象中的另一个原型
- 将新对象添加到本地存储
- $$hashKey在Angular中push()新对象时未生成新值
- 从分析类传递现有对象,否则创建一个新对象
- 为什么这个功能打印“;未定义的未定义的“;作为联系人名称,添加“新对象”
- Will my'新对象'在套接字断开连接时被垃圾收集
- 从数组javascript创建新对象
- 为新对象添加函数,将对象添加到数组中.理解困难'这'关键字
- 在for循环-Javascript中创建新对象
- Javascript:使用一个预先存在的对象值作为一个新对象的键
- 确定是创建新对象还是更新现有对象
- 返回它在Javascript中构建的新对象
- 如何使用Typescript创建一个包含对象的字段的新对象
- Sinon:存根和整个对象,并将其替换为新对象
- JavaScript:创建新对象类型的方法
- 将新对象“附加”到 ng 重复项