javascript - 将对象转换为 ul li 元素

标签 javascript jquery html arrays

我有一个数组中的对象列表

var myLevel = ['sub', 'topic', 'type']

var myCollection = new Array();
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 1', type: 'fib', topic: 'topic 2'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mtf'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 2', type: 'mcq', topic: 'topic 1'});
myCollection.push({sub: 'Book 2', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 2', topic: 'topic 1', type: 'mcq'});

我想使用 ul 和 li 将这些内容转换为正确的列表,列表的级别也取决于 myLevel 变量。

  • 第 1 册
    • 主题 1
      • mcq
      • mtf
    • 主题 2
      • 谎言
  • 第 2 册
    • 主题 1
      • mcq

每个部分都有一个独特的子项,不能有相同的。

我尝试将元素创建到 myCollection 的循环中

for(var i=0; i<myCollection.length; i++)
{
    for(var j=0; j<myLevel.length; j++)
    {
        createMyTree(myCollection[i][myLevel[j]);
    }
}


function createMyTree(str)
{
     //?????????????
}

请帮助我如何在所需的级别上创建元素。

最佳答案

好的,所以我重新做了它,它可以工作,除非有一个问题:主题 1 get 被分成两个主题 1,因为主题 2 get 插入在它们之间。

var myLevel = ['sub', 'topic', 'type'];

var myCollection = new Array();
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 1', type: 'fib', topic: 'topic 2'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mtf'});
myCollection.push({sub: 'Book 1', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 2', type: 'mcq', topic: 'topic 1'});
myCollection.push({sub: 'Book 2', topic: 'topic 1', type: 'mcq'});
myCollection.push({sub: 'Book 2', topic: 'topic 1', type: 'mcq'});

var dom="<ul>";
var used = new Array();
var currentItems = new Array(myLevel.length);
var lastJ = -1;

for(var i=0; i<myCollection.length; i++)
{
    var con = false;
    for(var k=0; k<used.length; k++){
        if(compareObjects(used[k], myCollection[i]))
            con = true;
    }
    if(!con){
        for(var j=0; j<myLevel.length; j++){
            if(currentItems[j] !== myCollection[i][myLevel[j]]){
                if(lastJ !== -1){
                    for(var l=0; l<lastJ-j; l++){
                        dom+="</ul></li>";   
                    }
                }
                for(var l=j+1; l<currentItems.length; l++)
                    currentItems[l] = "";
                currentItems[j] = myCollection[i][myLevel[j]];
                dom+="<li>"+currentItems[j]+(j<myLevel.length-1?"<ul>":"");
                lastJ = j;
            }
        }
        used.push(myCollection[i]);
    }
}
dom+="</ul>";
$('body').html(dom);

function compareObjects(obj1, obj2){
    if(obj1.length != obj2.length)
        return false;
    for(var el in obj1){
        if(obj2[el] === undefined)
            return false;
        if(obj1[el] !== obj2[el])
            return false;
    }
    return true;
}

关于javascript - 将对象转换为 ul li 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26628559/

相关文章:

javascript - 如何在 Bootstrap 列中将星级评分图像水平居中?

javascript - Rails link_to anchor 与远程 : true & method: :post

javascript - 操作 jQuery 元素时 `array.join` 优于字符串连接的好处?

javascript - 对象数组在 .push() 之后不显示内容

php - 如何处理来自 X-Editable 插件的 POSTed 数据?

javascript - 如何找到刷新页面的代码?

jquery - 将下拉菜单背景高度设置为绝对位置子菜单高度

jquery - 将类添加到 div 的末尾

javascript - 如何将 document.getElementById ("myNumber"的值存储在变量中并添加 if-else 语句

javascript - 如何将动态元素附加到在 lightgallery.js 中打开的图像