Переопределение функции равенства карты Javascript - PullRequest
0 голосов
/ 29 октября 2018

Я хочу создать карту (словарь) в Javascript, где ключом является массив чисел, а значением является некоторый объект. Я хочу извлечь из карты значение, ранее сохраненное с использованием того же содержимого массива, т. Е. Если у меня есть массив с некоторым содержимым, я хочу получить значение (если оно есть), ранее сохраненное для массива с таким же содержимым.

В большинстве других языков это было бы легко. Вы должны переопределить функцию равенства Map, чтобы два массива с одинаковым содержимым были протестированы равными. Это, кажется, не доступно Javascript. Ключи карты тестируются с использованием SameValueZero, который считает два объекта равными, только если они являются одним и тем же объектом.

Есть ли способ переопределить равенство или есть другой стандартный способ обработки этого случая в Javascript?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Если вам не нужны специальные функции Map (встроенная итерация значений в порядке вставки), и желаемая функция равенства может работать, сравнивая значения toString() массивов, вы можете использовать стандартный объект:

const notReallyAMap = {};
notReallyAMap[[0, 1, 2]] = 'whole';
notReallyAMap[[0.5, 2.75, 6.125]] = 'rational';
notReallyAMap[[1, 2, 3, 4, 5]] = 'my luggage';

const testArray = [1, 2, 3, 4, 5];
console.log(notReallyAMap[testArray]);
0 голосов
/ 29 октября 2018

Вы можете использовать Proxy, чтобы изменить способ доступа к свойствам объектов (что также означает элементы массивов). Они позволяют вам перехватывать свойства get и set с обратным вызовом.

Вот пример проксируемого массива, который хранит только два элемента и возвращает один из этих двух элементов независимо от того, какой индекс вы запрашиваете.

    const arr = new Proxy([], {
      get: function(self, prop) {
        const index = parseInt(prop, 10)
        // If the property is not a number, then no special handling
        if (isNaN(index)) {
          return self[prop]
        }
        
        if (index % 2 === 0) {
          // even
          return self[0]
        } else {
          // odd
          return self[1]
        }
      }
    })
    
    // Add just two elements
    arr.push('even')
    arr.push('odd')
    
    // Get any index
    console.log(arr[0]) // even
    console.log(arr[1]) // odd
    console.log(arr[2]) // even
    console.log(arr[301]) // odd

В качестве альтернативы, вы можете написать свой собственный класс, который не полагается на «магию» перехвата базовых операторов и просто имеет методы get(key) и set(key, value), которые используют любую логику, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...