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>

В момента използвам $ @ _ * като разделители на поднизове, които използвам за разделяне и извличане на данните, и точка и запетая между всяка група поднизове ("главен" клас), която използвам за разделяне на групите, но предпочитам използвайте само точка и запетая за всички разделители, тъй като divs от класове "note" и "title" могат да съдържат запетаи и същите текущи символи, използвани за разделяне на под-поднизове.

  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 масив. Клонингът предоставя и "шаблон" за по-нататъшна обработка. В piece, след завършване на извличането на текст и добавяне на отделен div текст към масива, клонираният текст се премахва - което води до "празен" шаблон, вижте el.innerText = "";. В // reverse process, записаният текст в arr попълва отново "празен" ul "шаблон" ; виж син "клонинг". За повторно попълване на "шаблон" с различни данни, може да предостави $.each() с различен масив, имащ същия .length като arr; напр.

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

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

В този 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
Коол! Въпрос: Имам нужда данните да бъдат инжектирани обратно в съответните им divs, следователно тези данни ще заменят съществуващите данни, които се различават от импортираните. Използвахте ли клониране, за да демонстрирате просто, че импортирането е извършено? - person koolness; 21.08.2014
comment
Дължината на текста ще се различава между съществуващия целеви li div клас текст и извлечените поднизове, направени да заменят този текст - надяваме се, че това няма значение - вашият код справя ли се с това? - person koolness; 21.08.2014
comment
Опитайте jsfiddle.net/guest271314/jhpsz018/7 . update е низ с 16 думи, split в масив с 15 length. Думи в низа с различни lengths. Може да замени, например, ["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