2016-03-11 3 views
-1

мне нужен массив вроде следующего:Самый простой способ определить ассоциативный массив

[0: 0, 1: 1, 2: 2] 

С помощью этого кода:

var arr = []; 

for(i=0; i<3; i++){ 
    arr[i] = i; 
} 

мой массив выглядит следующим образом:

[0, 1, 2] 

Значения будет обновляться по ключу:

arr[0] = 2.5; 
arr[1] = 8.4; 
arr[2] = 3.7; 
... 

В конце концов, обры будут отсортированы по значению, так что я, например, в следующий порядке:

[[0:2.5],[2:3.7],[1:8.4],...] 
+0

См., '[0, 1, 2]' Это равно '{0: 0, 1: 1, 2: 2}' –

+0

вы можете использовать объект .... –

+0

У JavaScript нет ключа => массивы значений. Вы можете использовать объекты или объект ES6 «Карта», который похож на HashMap в Java. –

ответ

1

Там нет понятия в JavaScript ассоциативного массива. Есть объекты, которые представляют собой коллекции пар ключ/значение. Объекты не упорядочены, поэтому их нельзя сортировать.

Если вы хотите, чтобы поддерживать порядок, я предлагаю использовать массив, элементы которого сами являются кортежи, содержащие индекс и значение:

var array = [[0, 0], [1, 1], [2, 2]]; 

Чтобы обновить значение:

array[1][1] = 8.4; 

Вы можете сортировать по значению с

var sorted_array = array.sort((a, b) => a[1] - b[1]) 

Теперь вы можете получить значение, связанное с «индексом» i с

sorted_array.find(elt => elt[0] === i)[1] 

Такой подход кажется проще, чем другие предложения, которые требуют поддержания две вещи, один объект, давая пар ключ/значение, а другой, являющейся массив, содержащий перечень упорядоченных ключей.

0

JavaScript не имеет понятия ассоциативного массива. Вы должны создать объект.

var arr = {}; 
for(var i=0; i<3; i++) { 
    arr[i] = i; 
} 
+0

Могу ли я по-прежнему сортировать его как 'obj.sort (sortFunc())'? – user1170330

+0

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

+0

Но возможность сортировки - это требование вопроса. –

0

Вы можете использовать массив и объекты для получения информации, такой как стоимость и порядок.

Заказ хранится в свойстве order, доступ к одному элементу по-прежнему возможен через индекс (обычный массив).

function sort() { 
 
    // get array and sort it and chnage order prop of objects 
 
    array.map(function (a, i) { return { index: i, value: a.value }; }).sort(function (a, b) { 
 
     return a.value - b.value; 
 
    }).forEach(function (a, i) { 
 
     array[a.index].order = i; 
 
    }); 
 
} 
 

 
function getSortedValues() { 
 
    var r = []; 
 
    array.forEach(function (a) { 
 
     r[a.order] = a.value; 
 
    }); 
 
    return r; 
 
} 
 

 

 
// build data structure 
 
var array = [2.5, 8.4, 3.7].map(function (a, i) { 
 
    return { value: a, order: i }; 
 
}); 
 

 
sort(); 
 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>'); 
 
// change a value 
 
array[2].value = 9.9; 
 
sort(); 
 
document.write('<pre>' + JSON.stringify(getSortedValues(), 0, 4) + '</pre>');

+0

Тогда как мне его сортировать? –

+0

Да, это правильное направление. Но как мы назначаем новое значение для записи, как OP хотел сделать с 'arr [1] = 8.4;'? –

+0

@downvoter, почему? –

0

Вы можете сохранить две структуры данных вокруг:

  • Объект, который дает доступ key => value.
  • Массив key s, который дает вам заказ.

Вы можете создать объект-оболочку, который инкапсулирует эти два и предоставляет API для выполнения необходимых операций (доступ по клавишам, сортировка, итерация и т. Д.).

0

Что вы хотите - это массив общих объектов (working pen), поскольку вам кажется, что вы хотите сохранить исходный индекс элемента Array. В основном вы создаете массив следующим образом: значения

var arr = []; 
var ARRAY_SIZE = 3; 

for (var i=0, len = ARRAY_SIZE; i < len; ++i){ 
    arr[i] = { id : i, value : null }; 
} 

запись так:

arr[0].value = 2.5; 
arr[1].value = 8.4; 
arr[2].value = 3.7; 

и затем сортировать так:

arr.sort(sort_function); 
function sort_function (a, b) 
{ 
    return a.value - b.value; 
} 

Лучше быть явным и назвать свои свойства - Я выбрал «id» вместо «исходный индекс» и «значение» вместо подразумеваемого анонимного, но выберите его роль в вашем приложении.

Смежные вопросы