我现在有这样的东西:
queryElastic().then(res => {
const map = {};
res.hits.hits.forEach(el => {
map [el._source.key] = el._source.value;
});
this.setState({
map : map
})
}
是否有更干净/更简洁的方法来设置地图对象?我正在考虑array.map,但这对我没有太大帮助,因为它返回一个数组,并且我需要设置对象中的所有键/值对。
在一个无关的问题上,有没有一种简单的方法可以反转平面对象的所有键/值对?基本上,我希望我的价值观成为关键,关键成为价值观。
当前我正在以一种愚蠢的方式进行:
const map = {};
const mapInverse = {};
res.hits.hits.forEach(el => {
map[el._source.key] = el._source.value;
mapInverse[el._source.value] = el._source.key;
})
提前谢谢大家。
创建映射的方法看起来已经很干净了,尽管通常我认为for
循环更适合简单的情况。
我可以这样写:
const res = await queryElastic();
const map = {};
for (const {_source: {key, value}} of res.hits) {
map[key] = value;
}
this.setState({
map,
})
你也可以这样做:
const map = Object.fromEntries(
res.hits.map(({_source: {key, value}}) => [key, value])
);
但是,行数减少并不一定使它更可读。你看一眼就明白了吗?其他团队成员会这样做吗?如果意图更清晰,更多的行可能是好的。
我会使用reduce
方法和对象销毁,它使事情变得非常整洁和可读imo:
const map = res.hits.hits.reduce((acc, {_source: {key, value}}) => (
{...acc, [key]: value}
), {});
它还使得修改以在";反向";按照您的要求-只需将[key]: value
更改为[value]: key
即可。
不确定这是否能提高可读性,但您可以收紧它,并在第一位使用reduce:来消除预先声明的变量
queryElastic().then(res => {
const map = res.hits.hits.reduce((acc, ({ _source: { key, value }})) => ({
...acc, [key]: value
}), {});
this.setState({
map : map
})
}
您可以使用Object.entries和Object.fromEntries来反转键和值:
const reversed = Object.fromEntries(
Object.entries(someObject)
.map(([key, value]) => [value, key])
)