jQuery 2.1.0 | Лучший способ разграничить длинную строку и извлечь из нее подстроки

Я динамически создал li, содержащий div, содержащие данные...

<ul>
<li><div class="master"><div class="note">how are you</div><div class="id">1234</div><div class="name">Paula</div><div class="nameid">MN9478</div><div class="title">My plane</div></div></li>
<li><div class="master"><div class="note">I am good</div><div class="id">5647</div><div class="name">John</div><div class="nameid">MN7649</div><div class="title">My boat</div></div></li>
<li><div class="master"><div class="note">Where are you</div><div class="id">9899</div><div class="name">Janette</div><div class="nameid">MN3995</div><div class="title">My car</div></div></li></ul>

... которые должны быть объединены в одну строку для добавления в div, например (тот же порядок, что и в li выше, но вместо символов используйте точки с запятой):

<div id="str">how are you$1234@Paula_MN9478*My plane;I am good$5647@John_MN7649*My boat;Where are you$9899@Janette_MN3995*My car</div>

В настоящее время я использую $ @ _ * в качестве разделителей подстрок, которые я использую для разделения и извлечения данных, и точку с запятой между каждой группой подстрок (мастер-класс), которую я использую для разделения групп, но я бы предпочел используйте только точки с запятой для всех разделителей, поскольку div классов «примечание» и «заголовок» могут содержать запятые и те же текущие символы, которые используются для разделения подстрок.

  1. Есть ли чистое решение, которое может обрабатывать создание строк только с точками с запятой в качестве разделителей в порядке, указанном в примере строки выше?

  2. Есть ли чистый способ обратить процесс вспять, т. е. извлечь данные из строки и ввести данные обратно в соответствующие им div внутри каждого li, как показано выше?

Требуется ли для этого какая-то формула массива? Я ничего не знаю об этом, любые указатели или примеры очень помогут.


person koolness    schedule 21.08.2014    source источник
comment
Чтобы создать строки, поместите их все в массив и используйте join(';'). Чтобы изменить его, используйте split(';'), затем переберите массив в группах по 5, создав DIV.   -  person Barmar    schedule 21.08.2014


Ответы (2)


Клон предоставляет как текст, так и str, который был извлечен и дополнен ; в массив <div id="str"> и arr. Клон также предоставляет «шаблон» для дальнейшей обработки. В части , после завершения извлечения текста и добавления отдельного div текста в массив, клонированный текст удаляется, в результате чего получается «пустой» шаблон, см. el.innerText = "";. В // reverse process сохраненный текст в arr повторно заполняет "пустой" ul "шаблон" ; см. синий «клон». Чтобы повторно заполнить «шаблон» другими данными, можно указать $.each() с другим массивом, имеющим тот же .length, что и arr; например.,

var update = ["abc", 123, .., ..];

, имеющий тот же порядок и длину, что и arr или , 15 , в текущем «шаблоне»; затем замените исходный ul на clone (обновите, замените существующий ul на clone, заполните другим text)< /а>.

В этом jsfiddle (обновить, добавить новый "шаблон" к body) "шаблон" повторно заполняется элементы' className вместо ранее извлеченных и сохраненных str , как это происходит в части ниже

Пытаться

// clone `ul`
var clone = $("ul").clone();
// create `<div id=str>`
var div = $("<div id=str>");
// `str` , text string
var str = "";
// `arr` , text array
var arr = [];
clone.find(".master div").each(function (i, el) {
    $(el).text(function (_, o) {
        return o + ";"
    });
    // substituted `el.innerText.trim()` for `$.trim($(el).text());`
    str = el.innerText.trim();
    arr.push(str);
    div.append(str);
    // replace `innerText` of `div` elements ,
    // with empty string , save `clone` `ul` as template 
    el.innerText = "";
});
// `str`
str = div.text();
// do stuff with `str`
div.css("color", "blue").prependTo("body");
// log processes
console.log(clone, div.text(), str, arr);

// reverse process
$.each(arr, function(k, v) {
    clone.find(".master div").eq(k)
    .text(function(_, o) {
      return o + v.replace(/;$/g, "")
    });
});
// log processes
console.log(clone.find(".master div").text());
// do stuff with clone , after replacing text
clone.css("color", "blue").appendTo("body");

jsfiddle http://jsfiddle.net/guest271314/jhpsz018/

person guest271314    schedule 21.08.2014
comment
Круто! Вопрос: Мне нужно, чтобы данные были введены обратно в соответствующие div, поэтому эти данные заменят существующие данные, которые отличаются от импортированных. Вы использовали клон, чтобы просто продемонстрировать, что импорт был выполнен? - person koolness; 21.08.2014
comment
Длина текста будет различаться между существующим текстом целевого класса li div и извлеченными подстроками, созданными для замены этого текста - надеюсь, это не имеет значения - ваш код справляется с этим? - person koolness; 21.08.2014
comment
Попробуйте jsfiddle.net/guest271314/jhpsz018/7 . update - это строка из 16 слов, split в массив из 15 length. Слова в строке, имеющие разные length. Можно заменить, например, ["string a", "string b , string c, string d", "123", "text , text , text",..], продолжающееся до тех пор, пока 0-15 индекс не будет завершен, вместо update в jsfiddle. Часть должна функционировать одинаково с различными или произвольными свойствами длины строки замены. - person guest271314; 22.08.2014
comment
Ваши образцы ответили на мои 2 вопроса. Спасибо за подробный ввод. - person koolness; 27.08.2014

Массив объектов, вероятно, является лучшим способом хранения ваших данных, где каждый объект имеет следующую форму:

var exampleRow = {
  id: 123,
  nameid: "MN9478",
  name: "Paula",
  title: "My plane",
  note: "how are you"
};

Затем вы можете получить доступ к атрибутам:

exampleRow.id // 123
// or
exampleRow["id"] // Also 123

Поместив каждую из этих строк в массив, вы получите данные в нормализованной форме:

var data = [{
    id: 123,
    nameid: "MN9478",
    name: "Paula",
    title: "My plane",
    note: "how are you"
  }, {
    id: 456,
    nameid: "MN7649",
    name: "John",
    title: "My boat",
    note: "I am good"
  }, {
    id: 789,
    nameid: "MN3995",
    name: "Janette",
    title: "My car",
    note: "where are you"
  }
];

Затем, в этот момент, вы можете легко преобразовать данные в любую структуру:

// For the complicated DOM structure
data.map(function(userInfo) {
    // Simplified to make it clear(er) what's going on
    return "<li><div class='master'><div class='note'>" + userInfo.note + "</div><div class='id'>" + ... etc. ... + "</div></li>";
});

// For the single string
data.reduce(function(finalString, userInfo) {
  return finalString + ";" + Object.keys(userInfo).map(function(k) { return userInfo[k]; }).join(";");
}, "");
person Sean Vieira    schedule 21.08.2014
comment
Потрясающий! Вопрос: Любое предложение по чистому способу разбить строку (теперь разделенную только точкой с запятой) на массив, как вы предлагаете в нормализованной форме, и как я спросил через alinea 2, чтобы весь приведенный выше код работал? Спасибо за экспертный вклад. - person koolness; 21.08.2014