![](/img/trans.png)
[英]looking for better way than having switch statement in array.map for javascript
[英]Better / Inline way to persist a variable between each iteration of Array.map()?
我有一个数组,其中一些元素与其他元素隐式配对,但不一定相邻。 我在这个数组上使用Array.map
来创建 JSX 元素(不重要)但是我需要在每次迭代之间跟踪我是否已经看到一个元素对。
代码实际上是这样的:
let pairedElementsSeen= {};
return <...>
{myArray.map(elem => {
if (elem.pairKey in pairedElementsSeen) {
return secondaryOption;
}
else {
pairedElementsSeen[elem.key] = someValue;
return defaultOption;
}
)}
</...>;
这已经按原样工作,但我不喜欢我需要额外的pairedElementsSeen
object ,由于 JSX 的结构和长度,必须在使用它之前很好地定义它。 Array.map
或类似的 function 是否有某种方法能够在每次迭代之间携带像pairedElementsSeen
这样的变量?
我唯一能想到的就是
sort
或filter
等其他数组操作内联组合的能力。这看起来像这样丑陋的一团糟:
return <...>
{(() => {
let pairedElementsSeen = {};
return myArray.map(...);
})()}
</...>;
还有其他想法吗?
您可以在没有中间 object 的情况下这样做(但效率较低),如下所示:
return <...>
{myArray.map((elem, i, arr) => {
const pairedElementSeen = arr.findIndex(e => e.key === elem.pairKey) < i;
return pairedElementSeen ? secondaryOption : defaultOption;
})}
</...>;
O(n) 方法(使用中间 object 但全部在一个数组 function 调用中):
return <...>
{myArray.reduce((agg, elem) => {
if (elem.pairKey in agg.pairedElementsSeen) {
agg.results.push(secondaryOption);
} else {
agg.pairedElementsSeen[elem.key] = true;
agg.results.push(defaultOption);
}
return agg;
}, { pairedElementsSeen: {}, results: [] }).results}
</...>;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.