根据值的条件根据值将键映射到数组的最有效方法是什么?
例如,我有一个映射,其中包含File对象作为键,布尔值为这样的值:
map = new Map([
[file, true],
[file1, true],
[file2, false],
[file3, true],
]);
请问如果映射值=== true,创建文件对象数组的快捷方式是什么?
预期结果
files = [file,file1,file3];
感谢您的帮助!
答案 0 :(得分:1)
您可以使用entries
来获取映射的键和值,然后使用filter
来获取值(条件)是否为真,然后使用.map
来获取映射的值。 [key, value]
进入密钥:
const map = new Map([
['file', true],
['file1', true],
['file2', false],
['file3', true],
]);
const files = [...map.entries()]
.filter(([_, cond]) => cond)
.map(([key]) => key);
console.log(files);
答案 1 :(得分:1)
一个简单的forEach循环可以解决这个问题。
const map = new Map([
['test', true],
['test2', true],
['test3', false],
['test4', true],
]);
const files = [];
map.forEach((value, key, map) => {
if (value) {
files.push(key)
}
});
console.log(files);
答案 2 :(得分:1)
您可以将Map.entries
与filter
和map
结合使用来实现此目的。基本思想是
Map.entries
true
的条目代码看起来像这样。
map.entries().filter(entry=>entry[1]).map(entry=>entry[0]);
答案 3 :(得分:1)
以上答案有效,但如果您追求最快的速度,也许令人惊讶的是,使用for循环比原型Map和数组方法要快
aka:
myMap = new Map([
["file", true],
["file1", true],
["file2", false],
["file3", true],
]);
const fastest = (files) => {
const map = [...files]
const out = []
for (let i=0; i<map.length; i++){
if (map[i][1]){
out.push(map[i][0])
}
}
return out
}
console.log(fastest(myMap))
https://coderwall.com/p/kvzbpa/don-t-use-array-foreach-use-for-instead 如果您四处看看,有很多关于这方面的文章和很多文献