Есть ли способ выбрать все значения вплоть до некоторого ключа на карте в JavaScript / Node? - PullRequest
2 голосов
/ 07 марта 2020

У меня есть эта Карта, в которой будут все виды идентификаторов в качестве ключей, и, что я хотел бы знать, это то, как вы можете получить значения Карты до тех пор, пока какой-то ключ не будет передан.

Учитывая, что у вас есть ключ, например «5», я хотел бы вернуть 0-5 и ничего дальше. Кроме того, ключи не упорядочены от 0 до бесконечности, я имею в виду индекс ключа на карте, если это возможно.

Я не знаю, подходит ли Map.entries() для этой проблемы.

Я приведу небольшой пример в виде массива:

[
  "n89w3rn98w3",
  "67q2g76gG67",
  "vna09wa9WHD",
  "g67a3889aIU",
  "ADW78aw3a8J",
  "89a7h3aIUJ4"
]

Учитывая, что вершина массива - индекс 0, а последнее значение - индекс 5. Если у меня есть ключ "g67a3889aIU "(4-й в массиве), я хотел бы получить следующее:

[
  "n89w3rn98w3",
  "67q2g76gG67",
  "vna09wa9WHD",
  "g67a3889aIU"
]

Какие первые 4, потому что это четвертый, который я ввел.

Но чтобы уточнить , это должна быть карта, а не массив. Я просто привел пример.

Спасибо

Ответы [ 2 ]

1 голос
/ 07 марта 2020

By manual :

Объект Map содержит пары ключ-значение и запоминает исходный порядок вставки ключей.

, поэтому он означает, что мы можем получить пары ключ-значение, выполнив итерацию и воссоздать другую карту на основе порядка.

function takeEntriesFromMapUntilKey(mapObject, untilKey, inclusive = true) {
  const newMap = new Map();
  
  for (const [key, value] of mapObject) {
   if (key !== untilKey) {
     newMap.set(key, value);
     continue;
   }
   if (inclusive) {
     newMap.set(key, value);
   }
   break;
  }
  
  return newMap;
}

const map1 = new Map();
map1.set("n89w3rn98w3", 'data1');
map1.set("67q2g76gG67", 'data2');
map1.set("vna09wa9WHD", 'data3');
map1.set("g67a3889aIU", 'data4');
map1.set("ADW78aw3a8J", 'data5');
map1.set("89a7h3aIUJ4", 'data6');


const map2 = takeEntriesFromMapUntilKey(map1, 'g67a3889aIU');
console.log(Array.from(map2.entries()));

const map3 = takeEntriesFromMapUntilKey(map1, 'g67a3889aIU', false);
console.log(Array.from(map3.entries()));
0 голосов
/ 07 марта 2020

Что-то типа loda sh вариант для вас?

пример кода:

const target = "g67a3889aIU";
_.takeWhile([
  "n89w3rn98w3",
  "67q2g76gG67",
  "vna09wa9WHD",
  "g67a3889aIU",
  "ADW78aw3a8J",
  "89a7h3aIUJ4"
], o => o !== target); // it will list all before g67a3889aIU then you can add it as well
...