gpt4 book ai didi

javascript - 将数组对象转换为嵌套的 ul li 元素

转载 作者:行者123 更新时间:2023-12-02 16:44:51 26 4
gpt4 key购买 nike

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

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

每个部分都有一个唯一的子项,没有重复的子项。

我尝试了这段代码,但它生成了重复的子项

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;
}

我得到以下结果

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

这里第 1 本书有两个主题 1.,这是不正确的。我只需要 1 个主题 1。主题 1 应该同时包含 mcq 和 mtf。

JSFiddle link

谢谢

最佳答案

使用下面给出的代码:

var $out;
$(document).ready(function()
{

for(var i=0; i<myCollection.length; i++)
{
$out = $('#out');
for(var j=0; j<levelTree.length; j++)
{
var itemName = myCollection[i][levelTree[j]];
var level = j;

/**********************************************************/


var $con;
if($out.children().eq(0).length == 0)
{
$con = $('<ul></ul>');
$con.append('<li>'+ itemName + '</li>');
$out.append($con);
}
else
{
var flag = $out.children().eq(0).children().filter(function(i, e)
{
return (this.childNodes[0].textContent == itemName);
});
console.log(flag.length);
if(flag.length == 0)
{
$out.children().eq(0).append('<li>' + itemName + '</li>');
}
}

var ele = $out.children(0).eq(0).children().filter(function(i, e)
{
return (this.childNodes[0].textContent == itemName);
}).get();
$out = $(ele);


/**********************************************************/
}
}
});

JSFiddle link

希望对您有所帮助。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com