我有一个JS private void command()
{
addPlayerBtn.PerformClick();
}
个对象,我想迭代而不更改Map(仅使用副作用)。
什么是语义上正确的方法呢?
我想到的解决方案:
Map
(看起来不错但在语义上不正确恕我直言,因为人们应该使用map来进行不改变迭代的数据结构的操作(?))
myMap.forEach((value, key) => {
// do something
});
(不像forEach那样可读,但在语义上更正确(?))
[... myMap].map(([key, value]) => {
// do something
});
(可能是最好的解决方案可读性,但与forEach相同的语义问题)
提前感谢您的帮助:)
答案 0 :(得分:1)
如mozilla docs中所示,您只能 使用map
对const map = new Map()
(forEach
)进行迭代。 map
,filter
和reduce
仅适用于阵列。在这种情况下,这不是语义问题。
当然你也可以选择for...of
循环,但这两个做不同的事情。我不认为它们是可以互换的。
const map = new Map([
[ 1, 'a' ],
[ 2, 'b' ],
[ 3, 'c' ],
]);
map.forEach((element, i) => console.log(element, i));
// a 1
// b 2
// c 3
for (const a of map) {
console.log(a);
}
// [ 1, 'a' ]
// [ 2, 'b' ]
// [ 3, 'c' ]

答案 1 :(得分:0)
不确定我的问题到底是什么..
对于不变性,你应该总是返回一个新的对象数组。但这实际上取决于您的需求。
如果您需要子集,则需要filter(..)
;如果它是数组数据的投影,则为map(..)
。如果需要一个全新的结构,您将使用经典的map-reduce / reduce,reduce(..)
。
请记住,如果数组中有复杂对象,则仍会返回新数组中的相同对象。只有数组本身是新的:
const x = [{a:1},{b:1}];
const y = x.map(e => e);
y[0].a++;
console.log(x);
console.log(y);
// [ { a: 2 }, { b: 1 } ]
// [ { a: 2 }, { b: 1 } ]