循环在dict里面的json数组

时间:2013-04-11 20:05:32

标签: javascript jquery json

我真的很喜欢javascript,但你必须学习。我正试图通过json字符串循环来构建一个表。它的工作(有点)。但是一件不起作用。我试图通过一系列布尔循环。如果是,则添加一个文本为“yes”的列,如果为false,则添加一个“no”。但那部分不起作用。它根本不会添加任何值!

我非常感谢我的代码的其他建议:

var jsonstr = '{"no_of_places": 4, "teams": {"Player 1": {"done": [true, true, true, false], "time": null},    "Player 2": {"done": [true, true, true, true], "time": "0 dagar 1:10:21"}, "Player 3": {"done": [true, true, true, true], "time": "0 dagar 2:47:34"}}}';

$(document).ready(function () {
    var result = jQuery.parseJSON(jsonstr);
    var theadTr = $('.scorestable thead tr');

    theadTr.append('<th>Team</th>');
    // Adds one header for each place
    for (var i = 0; i < result.no_of_places; i++) {
        theadTr.append('<th>' + (i + 1) + '</th>');
    }

    // Add teams and their result.
    $.each(result.teams, function (index, value) {
        var row = ['<tr><td>', index, '</td><td>'];
        // Add if place is found or not.
        $(this.done).each(function () {
            if (this === true) {
                row.concat(['<td>yes</td>']);
            } else {
                row.concat(['<td>no</td>']);
            }
        });

        $('.scorestable tbody').append(row.join('') + '</tr>');
    });
});

简单的HTML模板:

<p></p>
<table class="scorestable">
    <thead>
        <tr></tr>
    </thead>
    <tbody></tbody>
</table>

提示(或如果你愿意,请注意自己)

  1. 我真的从Kevin B的这个简单片段中学到了很多东西:

    $.each(["foo","bar","foobar"],function(i,val){
       console.log(typeof this,typeof i,typeof val); 
     });
    
     // OUTPUTS:
     // ========
     // object number string
     // object number string
     // object number string
    
  2. 在javascript中,数组是不可变的(如果我使用错误的术语,则编辑)。

    // So instead of:
    origArray.concat(['more', 'values']);
    
    // I need to write:
    origArray = origArray.concat(['more', 'values']);
    

5 个答案:

答案 0 :(得分:2)

您添加了额外的td JSFIDDLE

$.each(result.teams, function (index, value) {
        var row = ['<tr><td>', index, '</td>']; // extra td
        // Add if place is found or not.
        $(this.done).each(function () {
            if (this === true) {
                row = row.concat(['<td>yes</td>']);
            } else {
                row = row.concat(['<td>no</td>']);
            }
        });

        $('.scorestable tbody').append(row.join('') + '</tr>');
    });

答案 1 :(得分:1)

你需要改变=== on ==,因为这是布尔对象,这总是=== true。

试试这段代码:

if (this == true) {
  row.concat(['<td>yes</td>']);
} else {
   row.concat(['<td>no</td>']);
}

答案 2 :(得分:1)

我建议不要在$ .each中使用this,这并不是你所期望的。

http://jsfiddle.net/EzTL7/

而是使用您命名为value

的第二个参数
 $.each(result.teams, function (index, value) {
    var row = ['<tr><td>', index, '</td>'];
    // Add if place is found or not.
    $(value.done).each(function () {
        if (this === true) { // `this` is ok here because you're using $.fn.each and not $.each
            row.concat(['<td>yes</td>']);
        } else {
            row.concat(['<td>no</td>']);
        }
    });

    $('.scorestable tbody').append(row.join('') + '</tr>');
});

答案 3 :(得分:1)

你走了。 each()方法需要索引和值。该值是您的布尔值。

 // Add teams and their result.
$.each(result.teams, function (index, value) {
        var row = ['<tr><td>', index, '</td>']; // extra td
        // Add if place is found or not.
        $(this.done).each(function (index, value) {
            if (value === true) {
                row = row.concat(['<td>yes</td>']);
            } else {
                row = row.concat(['<td>no</td>']);
            }
        });

        $('.scorestable tbody').append(row.join('') + '</tr>');

    });

经过测试和工作

答案 4 :(得分:1)

您应该使用$.each来迭代数组。

   $.each(this.done, function (i, v) {
        if (v === true) {
            row = row.concat(['<td>yes</td>']);
        } else {
            row = row.concat(['<td>no</td>']);
        }
        console.log(row);
    });

你以错误的方式使用concatconcat不会更改被调用者的值,而应使用返回值:

row = row.concat(['<td>yes</td>']);

A working example for your code