在javascript中映射地图的语义正确方法

时间:2017-11-05 16:19:05

标签: javascript

我有一个JS private void command() { addPlayerBtn.PerformClick(); } 个对象,我想迭代而不更改Map(仅使用副作用)。
什么是语义上正确的方法呢?
我想到的解决方案:

Map

(看起来不错但在语义上不正确恕我直言,因为人们应该使用map来进行不改变迭代的数据结构的操作(?))

myMap.forEach((value, key) => {
    // do something
});

(不像forEach那样可读,但在语义上更正确(?))

[... myMap].map(([key, value]) => {
    // do something
});

(可能是最好的解决方案可读性,但与forEach相同的语义问题)

提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

mozilla docs中所示,您只能 使用mapconst map = new Map()forEach)进行迭代。 mapfilterreduce仅适用于阵列。在这种情况下,这不是语义问题。

当然你也可以选择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 } ]