javascript - 有没有有效的方法将数据设置到MapObject?

标签 javascript reactjs typescript algorithm

我想重新制作并排序一个数组。 是否可以使用“reduce”代替“forEach”或“map”? return beeProps.valueInfos.reduce (reduce()) 会很棒。

[Date,Onject] ---> [Number,Object] ---我想将相同的“Number”对象收集到一个数组中 ---> [Number ,Object[]]

我相信这里的人都很聪明...有人能找到好方法。


//Sample IO

  type Info = {
    title: string;
    InfoMap: Map<Date, Slot>; 
  };

  type Slot =
  | {
      kind: "on";
    }
  | {
      kind: "off";
    };

    let date1 = new Date(1999, 11, 31, 20);        
    let date2 = new Date(1999, 11, 31, 21);        
    let date3 = new Date(1999, 11, 31, 22); 
    let date4 = new Date(1999, 11, 31, 23);  

    const sampleInfoDetailMap:Map<Date, Slot> = new Map();
    sampleInfoDetailMap.set(date1,{kind: 'on' as const})
    sampleInfoDetailMap.set(date2,{kind: 'on' as const})
    sampleInfoDetailMap.set(date3,{kind: 'off' as const})
    sampleInfoDetailMap.set(date4,{kind: 'on' as const})

    const sampleInfoDetailMap2:Map<Date, Slot> = new Map();
    sampleInfoDetailMap2.set(date1,{kind: 'on' as const})
    sampleInfoDetailMap2.set(date2,{kind: 'off' as const})
    sampleInfoDetailMap2.set(date3,{kind: 'off' as const})
    sampleInfoDetailMap2.set(date4,{kind: 'on' as const})

    console.log(date1.getTime());
    console.log(date2.getTime());
   let sampleInfo:Info = {title:"test1"  ,InfoMap:sampleInfoDetailMap}
   let sampleInfo2:Info = {title:"test2"  ,InfoMap:sampleInfoDetailMap2}
   let info:Info[] = new Array();

    //ideal Output is 
    //numer => Date.getTime() : number;
    //Map<number,Slot[]>
    const idealResult:Map<number,Slot[]> = new Map();

   //[946638000000 , [on,on]
    //[946641600000 , [on,off]
//note: 946638000000 is 1999, 11, 31, 20. 946641600000 is 1999, 11, 31, 21

最佳答案

我无法从你的问题中确切地看出你在寻找什么,因为示例代码似乎没有指定特定的输入和输出。让我知道以下内容是否适合您:

const mapKeyMaps = <KI, KO, V>(
    keyMapper: (ki: KI) => KO,
    ...inputMaps: Map<KI, V>[]
): Map<KO, V[]> =>
    ([] as Array<[KI, V]>).concat(...inputMaps.map(m => Array.from(m.entries())))
        .map(([ki, v]) => [keyMapper(ki), v] as const)
        .reduce(
            (acc, [ko, v]) => ((acc.get(ko) || (acc.set(ko, []), acc.get(ko)!)).push(v), acc),
            new Map<KO, V[]>()
        );

它会为您的示例生成以下输出:

let info: Info[] = [sampleInfo, sampleInfo2];
const idealResult = mapKeyMaps((date) => date.getTime(), ...info.map(i => i.InfoMap))
console.log(JSON.stringify(Array.from(idealResult.entries())));
/*
[
    [946688400000,[{"kind":"on"},{"kind":"on"}]],
    [946692000000,[{"kind":"on"},{"kind":"off"}]],
    [946695600000,[{"kind":"off"},{"kind":"off"}]],
    [946699200000,[{"kind":"on"},{"kind":"on"}]]
]
*/

如果这对您有用,我将解释 mapKeyMaps() 的工作原理。如果没有,请编辑问题中的代码以构成 minimal reproducible example也许我可以提供更好的解决方案。不管怎样,祝你好运!

Link to code

关于javascript - 有没有有效的方法将数据设置到MapObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59306450/

相关文章:

javascript - 创建表时 marionette.js 中的嵌套 View

reactjs - 如何在 native react 中更新数组状态?

javascript - Reflect.getOwnMetadata 不是带有 karma-typescript 的函数

JavaScript 对象数组未正确导入

javascript - 在单独的选项卡上插入两次内容脚本?

javascript - 如何将数组元素组合到最后的一个警报框中

reactjs - 在自定义 React Hook 中维护多个状态值

reactjs - 如何修复 React 路由

typescript - TypeScript 中所有重载参数类型的类型

javascript - 模型窗口显示相同的内容