根据值将键映射到数组

时间:2019-01-03 02:58:16

标签: javascript typescript dictionary angular6

根据值的条件根据值将键映射到数组的最有效方法是什么?

例如,我有一个映射,其中包含File对象作为键,布尔值为这样的值:

map = new Map([
   [file, true],
   [file1, true],
   [file2, false],
   [file3, true],
]);

请问如果映射值=== true,创建文件对象数组的快捷方式是什么?

预期结果

files = [file,file1,file3];

感谢您的帮助!

4 个答案:

答案 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.entriesfiltermap结合使用来实现此目的。基本思想是

  1. 使用Map.entries
  2. 获取所有键/值的数组
  3. 将该数组过滤为仅包含值true的条目
  4. 使用map从Map条目转换为数组元素。

代码看起来像这样。

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 如果您四处看看,有很多关于这方面的文章和很多文献