0

これは簡単だと思っていましたが、奇妙な問題が発生しました。以下を分割したい。

theList = 'firstword:subwordone;subwordtwo;subwordthree;secondword:subwordone;thirdword:subwordone;subwordtwo;';

出力を

firstword
    subwordone
    subwordtwo
    subwordthree
secondword
    subwordone
thirdword
    subwordone
    subwordtwo

警告は、リストが時々

theList = 'subwordone;subwordtwo;subwordthree;subwordfour;'  

つまり、出力する ':' 部分文字列はありません。

    subwordone
    subwordtwo
    subwordthree
    subwordfour

次の基本関数のバリエーションを試し、再帰を試みましたが、無限ループに陥るか、未定義の出力になります。

function getUl(theList, splitOn){
    var r = '<ul>';
    var items = theList.split(splitOn);

    for(var li in items){
        r += ('<li>'+items[li]+'</li>');
    }
    r += '</ul>';
    return r;
}

上記の機能は私の出発点にすぎず、明らかに機能しません。私が下っているパスを示し、これが完全にベースから外れている場合は正しいパスを表示したかっただけです。

4

4 に答える 4

1

2 つのケースが必要なようですが、2 つの違いは、:文字列に a があるかどうかです。

if(theList.indexOf(':') == -1){
    //Handle the no sublist case
} else {
    //Handle the sublist case
}

サブリストがない場合から始めて、単純なパターンを作成します。

var elements = theList.split(';');
for(var i = 0; i < elements.length; i++){
    var element = elements[i];
    //Add your element to your list
}

最後に、同じパターンを適用して、サブリスト ケースの実装を考え出します。

var elements = theList.split(';');
for(var i = 0; i < elements.length; i++){
    var element = elements[i];
    if(element.indexOf(':') == -1){
        //Add your simple element to your list
    } else {
        var innerElements = element.split(':');

        //Add innerElements[0] as your parent element

        //Add innerElements[1] as your child element

        //Increment i until you hit another element with ':', adding the single elements each increment as child elements.

        //Decrement i so it considers the element with the ':' as a parent element.

    }
}
于 2013-02-07T15:39:48.203 に答える
0

アイテムを追加する現在のリストを追跡し、アイテムにコロンが見つかったときに新しいリストを作成します。

var baseParent = $('ul'), parent = baseParent;
$.each(theList.split(';'), function(i, e) {
  if (e.length) {
    var p = e.split(':');
    if (p.length > 1) {
      baseParent.append($('<li>').append($('<span>').text(p[0])).append(parent = $('<ul>')));
    }
    parent.append($('<li>').text(p[p.length - 1]));
  }
});

デモ: http://jsfiddle.net/Guffa/eWQpR/

のデモ"1;2;3;4;": http://jsfiddle.net/Guffa/eWQpR/2/

于 2013-02-07T15:53:23.847 に答える
0

おそらくもっとエレガントな解決策がありますが、これでうまくいきます。(以下の編集を参照

function showLists(text) {
    // Build the lists
    var lists = {'': []};
    for(var i = 0, listKey = ''; i < text.length; i += 2) {
        if(text[i + 1] == ':') {
            listKey = text[i];
            lists[listKey] = [];
        } else {
            lists[listKey].push(text[i]);
        }
    }

    // Show the lists
    for(var listName in lists) {
        if(listName) console.log(listName);

        for(var j in lists[listName]) {
            console.log((listName ? '    ' : '') + lists[listName][j]);
        }
    }
}

編集 あなたが取ることができる別の興味深いアプローチは、それをセクションに分割することから始めることです(textあなたが与えた例の1つに等しいと仮定します):

var lists = text.match(/([\w]:)?([\w];)+/g);

次に、問題をより単純なセグメントに分割しました

for(var i = 0; i < lists.length; i++) {
    var listParts = lists[i].split(':');
    if(listParts.length == 1) {
        console.log(listParts[0].split(';').join("\n"));
    } else {
        console.log(listParts[0]);
        console.log('    ' + listParts[1].split(';').join("\n    "));
    }
}
于 2013-02-07T15:54:01.510 に答える
0

次のスニペットは、要件に応じてリストを表示します

   var str  = 'subwordone;subwordtwo;subwordthree;';
    var a = []; var arr = [];
    a = str;
    var final = [];


    function split_string(a){

        var no_colon = true;

        for(var i = 0; i < a.length; i++){

    if(a[i] == ':'){
    no_colon = false;
    var temp;
    var index = a[i-1];
    var rest = a.substring(i+1);
    final[index] = split_string(rest);
    return a.substring(0, i-2);
    }

    } 

    if(no_colon) return a;

    }

    function display_list(element, index, array) {
        $('#results ul').append('<li>'+element+'</li>');
    }


    var no_colon_string = split_string(a).split(';');

    if(no_colon_string){
        $('#results').append('<ul><ul>');
    }
    no_colon_string.forEach(display_list);

    console.log(final);

ここで働くフィドル

于 2013-02-07T18:49:43.370 に答える