Массив Javascript с пользовательскими свойствами

#javascript #arrays #object #indexing #properties

#javascript #массивы #объект #индексирование #свойства

Вопрос:

Я начал использовать технологию индексации массивов, добавив к массиву ключевое свойство. Это полезно, если вы хотите сохранить порядок массива, но также выполнять быстрый поиск по нему (особенно при получении наборов данных из JSON). Преимущество свойств отдельных ключей в том, что они являются ссылкой на исходный элемент в массиве, сохраняя память.

Кто-нибудь может подумать о какой-либо памяти / последствиях для этого метода? Я уже сталкиваюсь с незначительными проблемами, такими как:

  • Qunit не может проверить свойство в array, поскольку он ожидает тип массива,
  • jQuery extend не будет копировать свойство key при копировании arrray.

Помимо этого, это кажется самым приятным способом индексирования массива при сохранении его порядка.

 var keyArray = function(arrayToKey,property){
        if (typeof arrayToKey !== 'undefined') {
            arrayToKey.key = {};
            var l = arrayToKey.length,
                i = 0;
            if (typeof property !== 'undefined') {
                for (i = 0; i < l; i  ) {
                    if (arrayToKey[i] !== null) {
                        arrayToKey.key[arrayToKey[i][property]] = arrayToKey[i];
                    }
                }
            } else {
                for (i = 0; i < l; i  ) {
                    if (arrayToKey[i] !== null) {
                        arrayToKey.key[arrayToKey[i]] = true;
                    }
                }
            }
        } else {
            return null;
        }
    };
  

Для этого берется массив и либо: вводит его в содержимое каждого элемента массива, либо, если в нем передано имя свойства, вводит его в свойство каждого объекта в массиве, например

 Example 1:
keyArray(['hello','nice','world']);
-> 
['hello',' ','world'].key{
    hello: true,
    nice, true,
    world, true
};
Example 2:
keyArray([
    {
        name: 'hello',
        value: 'hello value'
    },
    {
        name: 'nice',
        value: '  value'
    },
    {
        name: 'world',
        value: 'world value'
    }
]);
->
[
    {
        name: 'hello',
        value: 'hello value'
    },
    {
        name: 'nice',
        value: '  value'
    },
    {
        name: 'world',
        value: 'world value'
    }
].key{
    hello: {
        name: 'hello',
        value: 'hello value'
    },
    nice: {
        name: 'nice',
        value: 'nice value'
    },
    world: {
        name: 'world',
        value: 'world value'
    }
};
  

Комментарии:

1. Я не понимаю значения этого. В примере # 1 вам было бы лучше просто использовать объект в первую очередь. Ключ, похоже, не добавляет значения, поскольку у него нет никакой порядковой информации. В примере #2 ключ создает копию всего массива. Это, похоже, противоречит вашей цели экономии памяти. Если вам нужен способ быстрого поиска значения массива, то почему бы не создать объект, который на самом деле является просто перекрестной ссылкой на индекс массива? например, например. 2 {name: 'hello', value: 0 }

2. Приветствую Джейми. Во втором случае массив с ключом ЯВЛЯЕТСЯ ссылкой на исходный массив, а не копией (это просто кажется по способу его вывода). Причина, по которой я хочу это сделать, заключается в том, чтобы сохранить копию хэша массива как часть объекта array, который затем можно легко передавать по кругу. В текущем проекте, над которым я работаю, порядок элементов имеет решающее значение, но нам также приходится делать множество перекрестных ссылок между наборами данных массива, и хэш-ключи — это самый простой способ. Вы подчеркнули возможность наличия хэш-объекта с одним свойством для порядка исходного массива.