2015-12-10 4 views
1

У меня есть простой строки и я разбить его на массив:Javascript, основной ассоциативный массив

var alphabet = "a,b,c,d,e"; 
var letters = alphabet.split(","); 

var dict = []; 
for (var i = 0; i < letters.length; i++) { 
    dict[ letters[i] ] = true; 
} 

Что пни меня в том, что, когда я сделать

console.log(dict[letters[0]] +"|"+ dict["a"]); 

Я получаю

//true|undefined 

Я не понимаю разницы между буквами [0] и «a». И я абсолютно уверен, что буквы [0] и «a» - оба типа строки.

EDIT: Я просто попытался изменить переменную «dict» из квадратных скобок в фигурные, но она по-прежнему дает мне неопределенное значение.

EDIT 2: Ниже приведен код, с которым я работаю. «dictionary.txt» - это текстовый файл, содержащий около 90 тыс. слов, разделенных символом «\ n». В этом текстовом файле буква «a» находится в первой строке.

$.get("tiles/dictionary.txt", function(txt) { 
// Get an array of all the words 
var words = txt.split("\n"); 
// And add them as properties to the dictionary lookup 
// This will allow for fast lookups later 
for (var i = 0; i < words.length; i++) { 
    dict[ words[i] ] = true; 
} 
console.log(dict[words[0]]+"|"+dict["a"]); 
}); 

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

+0

Мой локальный Node.JS и JSFiddle, созданные @Ajwhiteway, работают как написано, поэтому это не код. Какую реализацию JS вы используете? –

+0

@MarkReed привет Марка, пожалуйста, см. Мой EDIT 2, спасибо. Я не уверен, что JS использует, но im на Netbeans 8.0.2 – Vibol

+0

Таким образом, ни одна из строк файла не является просто 'a'. Возможно, есть пробелы помимо новой строки? –

ответ

5

Проблема в том, что ваш текстовый файл имеет возврат каретки. Разделение на новую строку ("\n") не удаляет возврат каретки, поэтому первым элементом массива является не "a", а "a\r". Если изменить код к следующему, он должен работать, как это происходит в this fiddle:

$.get("https://dl.dropboxusercontent.com/u/16966255/dictionary.txt", 
     function(txt) { 
     var words = txt.split("\r\n"); 
     var dict = {}; 
     for (var i = 0; i < words.length; i++) { 
      dict[ words[i] ] = true; 
     } 
     alert(dict[words[0]]+"|"+dict["a"]); 
     }); 

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

var words = txt.split(/\r?\n/); 

Но если вы планируете использовать гораздо больший размер файла, обратите внимание, что расщепление с регулярным выражением заметно менее эффективен, чем расщепление с постоянной строкой.

Кроме того, хотя я изменил инициализацию dict от [] до более стандартного {}, это была не проблема; Массив - это всего лишь определенный тип объекта, и каждый объект в Javascript действительно является ассоциативным массивом.

+0

* «каждый объект в Javascript действительно является ассоциативным массивом» * Я бы этого не сказал. Объекты больше похожи на словари или карты. массив "подразумевает определенный порядок элементов, что не относится к свойствам объекта. Фактически любое сравнение объектов с другой структурой данных, вероятно, неверно. –

+0

@ Mark-reed Вы чертовски правы. ЕСЛИ вы вводите' typeof [ ] 'вы увидите' 'object ''. –

+1

@FelixKling Нет, «ассоциативный массив» не подразумевает упорядочение элементов, [это синоним «словаря» или «карты» в этих чувствах] (https: // ru. wikipedia.org/wik я/Associative_array). PHP, вероятно, является самой известной реализацией, которая на самом деле называет их «ассоциативными массивами», и ее упорядочивают, но это вовсе не подразумевается именем. –

3

Ваш dict var должен быть объектом, а не массивом. В JavaScript ассоциативные массивы являются объектами JSON.

var dict = {}; // Curly braces, not square brackets. 

for (var i = 0; i < letters.length; i++) { 
    dict[ letters[i] ] = true; 
} 

console.log(dict[letters[0]] +"|"+ dict["a"]); 

Вы получите

// true|true 
+4

JSON - это текстовый формат, а не какой-то объект. – npup

+1

. Более условно использовать синтаксис объектного литерала '{}', но он по-прежнему работает, если вместо этого использовать синтаксис литерала '[]'. Попробуйте, прежде чем уволить .. –

+0

Я пробовал это, но он все равно дает мне «неопределенный». :( – Vibol

-2

Javascript не поддерживает ассоциативные массивы. Если вы объявите его с помощью [], все индексы должны быть числами.

2

Я запустил ваш код как на JSFiddle, и он запустил true | true. Вы можете попробовать изменить

dict = []; 

в

dict = {}; 

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

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