我真的很喜欢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>
我真的从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
在javascript中,数组是不可变的(如果我使用错误的术语,则编辑)。
// So instead of:
origArray.concat(['more', 'values']);
// I need to write:
origArray = origArray.concat(['more', 'values']);
答案 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
,这并不是你所期望的。
而是使用您命名为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);
});
你以错误的方式使用concat
。 concat
不会更改被调用者的值,而应使用返回值:
row = row.concat(['<td>yes</td>']);