2015-12-02 4 views
1

Я пытаюсь разобрать стихи, чтобы каждая строка была элементом в массиве набора элементов, и каждое слово является элементом внутри этого массива (2 уровня). Я хочу, чтобы каждое слово находилось в промежутке, и (позже) каждая новая строка имела разрыв между ними.Установка значения вложенного цикла возвращает ошибку «e.replace не является функцией»

Я сталкиваюсь с проблемами при прохождении цикла, чтобы изменить значение отдельного слова (плитка [a] [b]) для обертывания в промежутке.

Вот код:

function tilify(){ 
    var tiletext = $(".tile-set").html().trim().replace("<br>"," ").replace(/ +(?=)/g," "); // trimming whitespace and regulating newline format to a double-space 
    tileset = tiletext.split(" "); // creating an array of lines 
    for (a in tileset) { 
    tileset[a] = tileset[a].split(" "); // creating a nested array of words 
    for (b in tileset[a]) { 
     tileset[a][b] = "<span class='tile'>" + tileset[a][b] + "</span>"; // returns error 
    }; 
    }; 
    $(".tile-set").html(tileset); 
} 

tilify(); 

Обнаружена ошибка Uncaught TypeError: e.replace is not a function

Я попробовал несколько синтаксиса цикла. Я также попытался избавиться от метода .replace, который я использую на всякий случай. Он работает, если я обертываю элементы первого массива в тегах span, но не во втором.

У меня есть jquery и jqueryUI работает.

Опять это блок У меня возникли проблемы с:

for (b in tileset[a]) { 
    tileset[a][b] = "<span class='tile'>" + tileset[a][b] + "</span>"; // returns error 
}; 

Вот тело HTML

<div class='container'> 
    <p class='tile-set'> 
    The boot is famous to the earth, 
    more famous than the dress shoe, 
    which is famous only to floors. 
    </p> 
</div> 
+0

Вы также могли бы разместить html? – DinoMyte

+0

Просто отредактировал его, чтобы включить HTML –

ответ

1

Ваш код взлома на $(".tile-set").html(tileset); линии, потому что в $ .html() не может обрабатывать вложенный массив. Он ищет массив строк. Если вы хотите включить все в один элемент, вам понадобится еще один цикл, а затем выполните следующее: for(a in tileset) { $(".tile-set").html($(".tile-set").html()+tileset[a]); }

+0

. Я думаю, что у вас есть правильное представление о проблеме, но ваш код не будет работать правильно. '$ (". tile-set "). html' не будет полезен! Вам понадобится '$ ('. Tile-set'). ForEach()' или somesuch. – ErikE

0

Что-то вроде этого делает то, что вы хотите?

function tilify(){ 
    var tiletext = $(".tile-set").html().trim().replace("<br>"," ").replace(/ +(?=)/g," "); // trimming whitespace and regulating newline format to a double-space 
    tileset = tiletext.split(" "); // creating an array of lines 
    $(".tile-set").html(""); // Set the html to be an empty string so we can concatenate 
    for (a in tileset) { 
     tileset[a] = tileset[a].split(" "); // creating a nested array of words 
     for (b in tileset[a]) { 
      $(".tile-set").html($(".tile-set").html() + "<span class='tile'>" + tileset[a][b] + "</span>"); 
     }; 
     }; 
    } 

    tilify(); 
} 

Вы получите этот выход Thebootisfamoustotheearth, morefamousthanthedressshoe, whichisfamousonlytofloors, но вы можете изменить <span></span> теги работать так, как вы хотите.

0

Проблема заключалась в попытке передать вложенный массив в метод .html() (спасибо Филу). Я передал текст в переменную tilesetBody и использовал это вместо этого.

function tilify() { 
    var tiletext = $(".tile-set").html().trim().replace("<br>"," ").replace(/ +(?=)/g," ").replace(/,/g, "").replace(/\./g,"").replace(/\;/g,""); 
    var tilesetBody = ""; 
    tileset = tiletext.split(" "); 

    for (a in tileset) { 
    tileset[a] = tileset[a].split(" "); 
    for (b in tileset[a]) { 
     if (tileset[a][b] != "") { 
     tileset[a][b] = "<span class='tile'>" + tileset[a][b] + "</span> "; 
     tilesetBody += tileset[a][b]; 
     } 
    }; 
    tilesetBody += "<br>"; 
    }; 

    $(".tile-set").html(tilesetBody); 
} 
Смежные вопросы