Javascript - 设置对象字段和值的干净方法,而不是使用 forEach 循环?



我现在有这样的东西:

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])
)

最新更新