【问题标题】:Javascript nested array with nested loops带有嵌套循环的 Javascript 嵌套数组
【发布时间】:2011-10-07 15:46:24
【问题描述】:

到目前为止,我尽我所能创建了一个嵌套数组,但我觉得我做错了,或者有些东西没有意义。任何人都可以看看并告诉我我的数组是否是构建嵌套数组的方法。我想要的只是在特定标题下创建行,所以我嵌套数据并使用嵌套循环调用它。也许有一种更简单的方法来实现它。代码如下:

var data = [

    {title:'Row Title 1'},

    [{leftCol:'Some text for left column',rightCol:'Some text for right column'},
    {leftCol:'Some text for left column',rightCol:'Some text for right column'},
    {leftCol:'Some text for left column',rightCol:'Some text for right column'}],

    {title:'Row Title 2'},

    [{leftCol:'Some text for left column',rightCol:'Some text for right column'},
    {leftCol:'Some text for left column',rightCol:'Some text for right column'},
    {leftCol:'Some text for left column',rightCol:'Some text for right column'}]

    ];

    for (var i=0, j=data.length; i < j; i++) {

        if(data[i].title != null){
            document.write('<b>'+data[i].title+'</b><br />');
        }

        for(p=0,plen=data[i].length; p<plen;p++){
            document.write('<p style="background:#eee;">'+data[i][p].leftCol+'</p>');
            document.write('<p>'+data[i][p].rightCol+'</p>');       
        }
    }

【问题讨论】:

  • 您选择使用数组而不是 JSON 有什么特别的原因吗?
  • 没有理由。但是我的代码正在破坏我的移动应用程序,我觉得我的数组做错了,因为如果我去掉标题“{title:'Row Title 1'}”那么它就可以完美运行。
  • 您的代码中断的原因是因为您的嵌套 for 循环不是有条件的(它检查对象 {title: 'Row Title 1'}{title: 'Row Title 2'} 的长度属性)。将其包装在 else 范围内。

标签: javascript arrays multidimensional-array nested-loops


【解决方案1】:

你使用的结构应该更像这样:

var data = [

    {title:'Row Title 1', contents: [

      {leftCol:'Some text for left column',rightCol:'Some text for right column'},
      {leftCol:'Some text for left column',rightCol:'Some text for right column'},
      {leftCol:'Some text for left column',rightCol:'Some text for right column'}

    ],

    // ...
];

这样,每一行都是一个具有“title”属性和“contents”属性的对象。您的循环将如下所示:

for (var i=0, j=data.length; i < j; i++) {

    if(data[i].title != null){
        document.write('<b>'+data[i].title+'</b><br />');
    }

    for(var p=0, plen=data[i].contents.length; p < plen; p++){
        document.write('<p style="background:#eee;">'+data[i].contents[p].leftCol+'</p>');
        document.write('<p>'+data[i].contents[p].rightCol+'</p>');       
    }
}

【讨论】:

  • 数据的结构并不重要,只要你用来检索它的算法正确。再说一次,以逻辑方式构造数据始终是一个好习惯。所以+1! ;)
  • 是的,你写的是真的。如果有必要将结构与 OP 中的一样,则可以在 JavaScript 中处理它,但我个人喜欢尽可能接近问题开始的位置来解决问题 :-)
【解决方案2】:

如果您想让您的代码更加健壮,请遵循以下准则:

  1. 如果你有一个长度,最好像这样初始化循环:for (var i = 0, l = length; l--; i++)Nicholas C. Zakas 更详细地解释了这种语法的原因。
  2. 始终将多次访问的变量存储在局部变量中。它加快了执行速度(例如idata = data[i];)。
  3. 尽可能避免使用鸭式打字(例如data[i].title != null)。首先检查变量的类型。它速度较慢,但​​代码更易于理解和维护。试试帖子底部的typeOf 功能(例如typeOf(idata) === "Object")。
  4. 通常最好使用=== 而不是==!== 而不是!=,因为它们不执行可能导致意外结果的类型强制。
  5. 不要创建多个内联样式,而是创建一个类.greyBackground { background-color: #EEEEEE; },并将每个leftCol 段落的className 设置为greyBackground
  6. 避免使用document.write。它很慢,会导致文档重排,并在页面下载时停止加载资产。使用 JavaScript 创建动态内容的最佳方法是使用 document.createDocumentFragment 方法,我将在下面解释。
  7. 最好自己用 JavaScript 创建节点。如果您在document.writeelement.innerHTML 中使用字符串,则浏览器会解析字符串并将其转换为节点。因此使用该方法比较慢。

这就是我编写你的 JavaScript 的方式:

var data = [
    "Row Title 1",
    {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    }, {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    }, {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    },
    "Row Title 2",
    {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    }, {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    }, {
        "leftCol": "Some text for left column",
        "rightCol": "Some text for right column"
    }
];

function typeOf(value) {
    if (value === null) {
        return "null";
    } else if (typeof value === "undefined") {
        return "undefined";
    } else {
        return Object.prototype.toString.call(value).slice(8, -1);
    }
}

var element;
var fragment = document.createDocumentFragment();
var idata;

for (var i = 0, l = data.length; l--; i++) {
    idata = data[i];
    if (typeOf(idata) === "Object") {
        element = document.createElement("p");
        element.className = "greyBackground";
        element.appendChild(document.createTextNode(idata.leftCol));
        fragment.appendChild(element);

        element = document.createElement("p");
        element.appendChild(document.createTextNode(idata.rightCol));
        fragment.appendChild(element);
    } else {
        element = document.createElement("b");
        element.appendChild(document.createTextNode(idata));
        fragment.appendChild(element);

        element = document.createElement("br");
        fragment.appendChild(element);
    }
}

document.body.appendChild(fragment);

测试我的页面和你的页面。很可能我的执行速度会更快。如果您有任何疑问,请随时问我。干杯! =)

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多