【问题标题】:reorder Map object by key按键重新排序 Map 对象
【发布时间】:2021-06-17 22:36:50
【问题描述】:

我有一个看起来像这样的 Map 对象:

const myMap = new Map();
myMap.set('a', 1);
myMap.set('b', 2);
myMap.set('c', 3);
myMap.set('d', 4);

我需要能够重新排序,这样,如果有一个特定的键,这个键将是第一个,最初跟随它的那些键应该像以前一样跟随,而最初在它之前的那些将被放在最后,它们的原始订单。

数组示例:

const key = 'c';
const pre = ['a','b','c','d'];
const post = ['c','d','a','b'];

另一个例子:

const key = 'd';
const pre = ['a','b','c','d'];
const post = ['d','a','b','c'];

还有一个:

const key = 'a';
const pre = ['a','b','c','d'];
const post = ['a','b','c','d'];

我想我应该用myMap.keys() 拿到钥匙并重建我的地图,买我的大脑真的很难找出如何处理它以实现我想要的......

任何提示将不胜感激。

【问题讨论】:

  • 这能回答你的问题吗? Is it possible to sort a ES6 map object?
  • 不是真的,但还是谢谢 ;)。我不是要对其进行排序,而是要按特定顺序对其进行重新排序。
  • 很久很久以前,我使用 TypeScript。但是你不能重新分配数字吗?而不是做一个排序?
  • @Wendelin 好吧,我说的是它的元素的插入。 AFAIK,当获取地图的键时,它们的顺序就像插入一样。
  • 另外,来自developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…:“Map 中的键以简单、直接的方式排序:Map 对象按照条目插入的顺序迭代条目、键和值。”

标签: javascript


【解决方案1】:

这似乎有效:

let reorder = (map, keys) =>
    new Map(keys.map(k => [k, map.get(k)]))


let rotate = (ary, n) =>
  ary.slice(n).concat(ary.slice(0, n))


const myMap = new Map();
myMap.set('a', 1);
myMap.set('b', 2);
myMap.set('c', 3);
myMap.set('d', 4);


keys = [...myMap.keys()]
newMap = reorder(myMap, rotate(keys, keys.indexOf('c')))
console.log([...newMap.entries()])

【讨论】:

    【解决方案2】:

    伟大的挑战!我真的很喜欢这样做!

    这是我的方法:

    function orderMyMap(myMap, key) {
        const array = Array.from(myMap)
        return [...array.splice(array.findIndex((arr) => arr[0] === key), array.length), ...array];
    }
    

    如果你想要一个地图而不是一个数组作为响应,只需添加:

    function orderMyMap(myMap, key) {
        const array = Array.from(myMap)
        const newArray = [...array.splice(array.findIndex((arr) => arr[0] === key), array.length), ...array];
    
        const newMap = new Map();
        
        newArray.map(values=>{
            newMap.set(values[0],values[1])
        })
        return newMap
    }
    

    【讨论】:

    • 非常感谢。这确实非常有效!我接受了另一个答案,因为它有效并且在你之前提供了......我非常感谢你的努力,我希望我能接受两个答案;)无论如何,非常感谢你花时间帮助我
    【解决方案3】:

    对此的一种解决方案可能是,您首先保存要重新排序的 [key, value],然后将其从 地图 中删除,然后通过将保存的值设置为开始。

    数组示例:

    const key = 'd';
    const keys = ['a', 'b', 'c', 'd'];
    // remove the last occurence of the key from array
    keys.splice(keys.lastIndexOf(key), 1);
    // add new element at the beginning
    keys.unshift(key);
    

    Splice 从数组中删除从给定位置和作为第二个参数提供的元素数量开始的元素。

    Unshift在数组的开头添加一个新元素

    您的问题的一种可能的解决方案:

    // First store the keyValue element you're going to reorder
    const keyValue = [key, myMap.get(key)];
    // Remove from initial map the key element
    myMap.delete(key);
    // Make a new map from what you have
    myMap = new Map([keyValue, ...myMap]);
    

    您可以创建一个新的Map,将一个数组 传递给constructor,这将产生您希望的正确顺序。虽然这个解决方案可能看起来不是很理想,但是它的性能仍然相对较好,因为获取和删除元素是 O(1),但唯一的事情是你要重建一个新的 Map 对象每次都会导致O(n)

    【讨论】:

      【解决方案4】:

      const myMap = new Map();
      myMap.set('a', 1);
      myMap.set('b', 2);
      myMap.set('c', 3);
      myMap.set('d', 4);
      
      function sortByKey(map, key){
        if(map.size <= 1) return map;
      
        const entries = [...map.entries()];
        const index = entries.findIndex(entry => entry[0] === key);
        return new Map([entries[index], ...entries.slice(index + 1, entries.length), ...entries.slice(0, index)]);
      }
      
      console.log('a', [...sortByKey(myMap, 'a').keys()]);
      console.log('b', [...sortByKey(myMap, 'b').keys()]);
      console.log('c', [...sortByKey(myMap, 'c').keys()]);
      console.log('d', [...sortByKey(myMap, 'd').keys()]);

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 2023-04-06
        • 2020-05-21
        • 2021-11-22
        • 2023-01-19
        • 2016-07-04
        • 2013-11-19
        • 1970-01-01
        • 2011-07-24
        相关资源
        最近更新 更多