【发布时间】:2019-10-04 20:31:26
【问题描述】:
问题
我认为这两个for loops 存在范围问题。它们每个都在迭代不同数量的项目。
- 我正在尝试弄清楚如何在第二个循环中从第一个循环引用
i迭代器。 - 具体来说,我在第二个循环的 if 语句的 else 部分连接一个字符串,我需要能够同时引用
i和j
澄清
我正在尝试创建一个 11 x 8 的网格,总共 88 个正方形。他们需要附加一个特定的类,这将为正方形着色。每个方块都有一个从 1 到 88 的数据 ID,用于确定它们在网格上的位置。需要根据数据着色的状态/方块不是按data.jsonsn-p 中看到的顺序。
循环 #1
i 从 0、1、2 ... 50 开始
for (i = 0; i < data.length; i++) {}
循环 #2
j 从 1、2、3 ... 88 开始
for (j = 1; j < squaresTotal + 1; j++) {
// If it doesn't exist, push those values into the an array
if (states.indexOf(j) === -1){
blanks.push(j);
$("<div class='square is-white' data-id='" + j + "'></div>").appendTo(".map");
} else {
$("<div class='square " + data[i].class + "' data-id='" + j + "'><p class='square__state'>" + data[i].abbr + "</p></div>").appendTo(".map");
}
}
scripts.js
<script>
$(function(){
$.ajax({
url: 'data.json',
method: 'GET',
dataType: 'json'
}).then(main);
});
function main(data) {
// The parent container that holds the map
let map = $(".map");
// IDs of the states and the blank tiles
let blanks = [];
let states = [];
// Contains data for all 50 states
for (i = 0; i < data.length; i++) {
// Data is sorted by the rank field in descending order
data.sort(function(a, b){
return a['rank'] - b['rank'];
});
// Fields for the data table below the map
// Numbered rank (i.e. 1, 2, 3)
let rank = data[i].rank;
// Full state name (i.e. Alaska)
let state = data[i].state;
// Total consumer electric power
let value = (data[i].total_consumption_electric_power).toLocaleString();
// Each row in the table contains a rank, state and value
if (rank) {
$("<tr><th scope='row'>" + data[i].rank + "</th><td>" + data[i].state + "</td><td>" + value + "</td></tr>").appendTo("tbody");
}
// Push the ids to the empty states array
states.push(data[i].id);
}
// The grid is 11 by 8 for a total of 88 squares
const squaresTotal = 88;
for (j = 1; j < squaresTotal + 1; j++) {
// If it doesn't exist, push those values into the an array
if (states.indexOf(j) === -1){
blanks.push(j);
$("<div class='square is-white' data-id='" + j + "'></div>").appendTo(".map");
} else {
$("<div class='square " + data[i].class + "' data-id='" + j + "'><p class='square__state'>" + data[i].abbr + "</p></div>").appendTo(".map");
}
}
var pymChild = new pym.Child();
pymChild.sendHeight();
}
</script>
data.json(片段)
[
{
"id": 1,
"state": "Alaska",
"rank": "",
"abbr": "AK",
"class": "square-1",
"total_consumption_electric_power": 707913
},
{
"id": 11,
"state": "Maine",
"rank": "",
"abbr": "ME",
"class": "square-1",
"total_consumption_electric_power": 62360
},
{
"id": 17,
"state": "Wisconsin",
"rank": "",
"abbr": "WI",
"class": "square-5",
"total_consumption_electric_power": 19482575
}
]
【问题讨论】:
-
你可以在第一个循环之外声明 i ,但它总是会在你的第二个循环中引用相同的索引。这就是你想要的工作方式吗?
-
将
j的for-loop 放在i....足够大。首选 documentFragment 并在最后附加到实时页面。 -
@AndrewNguyen 这是执行 50 * 88 次的唯一方法。否则,如前所述,一旦
j循环运行,i将始终为 50。为什么j在i循环内循环不是一个选项? -
@AndrewNguyen 请澄清意图是什么?你能展示一个
data.json的样本吗?我阅读代码的方式是有 50 个状态,并且您希望每个状态有 88 个白色方块。如果这不正确,我不明白像<div class='square " + data[i].class + "' data-id='" + j + "'>这样的行应该做什么。 -
我现在明白了。
j循环内不需要i,因为您只有 88 个方格。在这 88 个方格中,50 个是状态,38 个是空白。代替states.push(data[i].id);,使用states.push({ id: data[i].id, class: data[i].class, abbr: data[i].abbr);。现在,如果您更改if (states.indexOf(j) === -1){ blanks.push(j);,则在j循环中不再需要i,因为如果您更改结构,类和缩写也可以在states[j].class中。
标签: javascript jquery for-loop scope iterator