Javascript-设置对象字段和值的方式比使用forEach循环更干净?
我现在有这样的东西:Javascript-设置对象字段和值的方式比使用forEach循环更干净?,javascript,arrays,ecmascript-6,foreach,Javascript,Arrays,Ecmascript 6,Foreach,我现在有这样的东西: queryElastic().then(res => { const map = {}; res.hits.hits.forEach(el => { map [el._source.key] = el._source.value; }); this.setState({ map : map }) } 是否有更清晰/更简洁的方法来设置贴图对象?我考虑使用array.map,但这对我帮助不大,因为它返回一个数组,我需要设置对象
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=等待查询; 常量映射={}; 对于res.hits的const{u source:{key,value}}{ 映射[键]=值; } 这是我的国家{ 地图 } 您也可以这样做:
queryElastic().then(res => {
const map = {};
res.hits.hits.forEach(el => {
map [el._source.key] = el._source.value;
});
this.setState({
map : map
})
}
const map=Object.fromEntries
res.hits.map{{u source:{key,value}}=>[key,value]
;
但行数减少并不一定会使它更具可读性。你看一眼就能明白这是怎么回事吗?其他团队成员也这样做吗?如果意图更清晰,多行就更好了。您创建地图的方法看起来已经很干净了,不过一般来说,我认为for循环更适合于简单的情况 我可以这样写: const res=等待查询; 常量映射={}; 对于res.hits的const{u source:{key,value}}{ 映射[键]=值; } 这是我的国家{ 地图 } 您也可以这样做:
queryElastic().then(res => {
const map = {};
res.hits.hits.forEach(el => {
map [el._source.key] = el._source.value;
});
this.setState({
map : map
})
}
const map=Object.fromEntries
res.hits.map{{u source:{key,value}}=>[key,value]
;
但行数减少并不一定会使它更具可读性。你看一眼就能明白这是怎么回事吗?其他团队成员也这样做吗?如果意图更清晰,多行就更好了。我会使用reduce方法和对象分解,它使事情变得非常整洁易读:
const map = res.hits.hits.reduce((acc, {_source: {key, value}}) => (
{...acc, [key]: value}
), {});
这也使得按照您要求的相反方式进行修改变得非常简单-只需将[key]:value更改为[value]:key即可。我将使用reduce方法和对象解构,它使事情变得非常整洁和可读:
const map = res.hits.hits.reduce((acc, {_source: {key, value}}) => (
{...acc, [key]: value}
), {});
这也使得按照您的要求以相反的方式进行修改变得非常简单-只需将[key]:值更改为[value]:键。不确定这是否会提高可读性,但您可以将其收紧,并消除用于第一位的预声明变量: querylastic.thenres=>{ const map=res.hits.hits.reduceacc,{u source:{key,value}}=>{ …acc,[键]:值 }, {}; 这是我的国家{ 地图:地图 } } 您可以使用和反转键和值: const reversed=Object.fromEntries Object.entriessomeObject .map[键,值]=>[值,键]
不确定这是否提高了可读性,但您可以收紧它并消除第一位使用的预先声明的变量: querylastic.thenres=>{ const map=res.hits.hits.reduceacc,{u source:{key,value}}=>{ …acc,[键]:值 }, {}; 这是我的国家{ 地图:地图 } } 您可以使用和反转键和值: const reversed=Object.fromEntries Object.entriessomeObject .map[键,值]=>[值,键]
尤其像你的评论,如果它不清楚或不明显的是什么,或者它是如何工作的,那么更短并不一定更好。这需要经常教。谢谢你的建议。每个map[key]对的look和manually设置的标准似乎是最可读的。较短的实际上可读性较差!尤其像你的评论,如果它不清楚或不明显的是什么,或者它是如何工作的,那么更短并不一定更好。这需要经常教。谢谢你的建议。每个map[key]对的look和manually设置的标准似乎是最可读的。较短的实际上可读性较差!谢谢你的建议。我在考虑arr.reduce,但它似乎没有提高可读性!谢谢你的建议。我在考虑arr.reduce,但它似乎没有提高可读性!