涉及数组的for循环问题
For-loop issue involving arrays
我正在尝试制作一个基于模拟元数据的 for 循环。
数据代表数据内容
Meta 表示 3 种不同的元数据类型。如果有 1 则表示元数据存在于数据中,如果有 0 则表示它不存在。
Size表示存在元数据时每个数据的大小。因此,如果存在大小为 3 的 1 1 1 的元数据:
- 代表meta 1数组中的前3个元素,meta 2数组中的后3个元素,meta 3数组中的后3个元素。
我遇到的问题是正确地从左到右按顺序读取它,如果它用完了数据而不是创建新数据,就停止从数组中读取。
如果我们有 [1, 2, 3, 4, 5] 的数据和 1, 1, 1,大小 1 的元数据,它应该是:
元 1: 1
元 2:2
元 3:3
或者如果它是 [1, 2, 3 4, 5, 6, 7, 8, 9, 10, 11, 12] 的数据和 1, 0, 1,大小 4 的元数据,它应该是:
元 1:1 2 3 4
元 2:无
元 3:5 6 7 8
What I have so far:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
for (let i = 0; i < 3; i++) {
if (meta[i]) {
if (i == 0) {
console.log('Meta', 1);
for (let i = 0; i < size; i++) {
console.log(data[i]);
}
}
if (i = 1) {
console.log('Meta', 2);
for (let i = 0; i < size; i++) {
console.log(data[i] + size);
}
}
if (i = 2) {
console.log('Meta', 3);
for (let i = 0; i < size; i++) {
console.log(data[i] + size + size);
}
}
}
}
您可以按照以下步骤进行操作:
- 创建一个以
data
、meta
和 size
作为三个参数的函数。
- 创建一个空数组来作为结果。
- 然后遍历
meta
数组。
- 然后从开始处获取数组中等于数组大小的部分。
push()
结果数组。
- 从原始数组中删除添加的部分。
- 最后return个结果
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
function parts(data,meta,size){
let res = [];
for(let i = 0;i<meta.length;i++){
res.push(data.slice(0,size * meta[i]));
data = data.slice(meta[i] * size);
}
return res;
}
console.log(parts(data,meta,size))
听起来您只想从 data
中获取大小为 size
的 slice
,如果元标志为真。您应该能够通过简单地遍历 meta
来做到这一点,同时跟踪数据中的当前位置:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
let res = [];
for (let i = 0, cur = 0; i < meta.length; i++){
res.push(data.slice(cur, cur + size * meta[i]))
cur += size * meta[i]
}
console.log(res)
您可以删除内部 if-statements,因为它们是重复的,而是使用变量 i
来打印 i
th 加上一个元值。
在下面的代码片段中,我创建了一个变量 j
,用于跟踪我们在数据中的哪个点。这用于在找到每个 meta
时在 size
的段中跳转。
然后在内部 for 循环中,我从 j
循环到 j+size
,这是长度为 size
.[=20= 的 data
数组的特定部分]
参见下面的示例:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
let j = 0;
for (let i = 0; i < meta.length; i++) {
console.log('Meta', i+1);
if (meta[i]) {
for(let k = j; k < j+size && k < data.length; k++) {
console.log(data[k]);
}
j+=size;
} else {
console.log("-- Nothing --");
}
}
我正在尝试制作一个基于模拟元数据的 for 循环。
数据代表数据内容
Meta 表示 3 种不同的元数据类型。如果有 1 则表示元数据存在于数据中,如果有 0 则表示它不存在。
Size表示存在元数据时每个数据的大小。因此,如果存在大小为 3 的 1 1 1 的元数据:
- 代表meta 1数组中的前3个元素,meta 2数组中的后3个元素,meta 3数组中的后3个元素。
我遇到的问题是正确地从左到右按顺序读取它,如果它用完了数据而不是创建新数据,就停止从数组中读取。
如果我们有 [1, 2, 3, 4, 5] 的数据和 1, 1, 1,大小 1 的元数据,它应该是:
元 1: 1
元 2:2
元 3:3
或者如果它是 [1, 2, 3 4, 5, 6, 7, 8, 9, 10, 11, 12] 的数据和 1, 0, 1,大小 4 的元数据,它应该是:
元 1:1 2 3 4
元 2:无
元 3:5 6 7 8
What I have so far:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
for (let i = 0; i < 3; i++) {
if (meta[i]) {
if (i == 0) {
console.log('Meta', 1);
for (let i = 0; i < size; i++) {
console.log(data[i]);
}
}
if (i = 1) {
console.log('Meta', 2);
for (let i = 0; i < size; i++) {
console.log(data[i] + size);
}
}
if (i = 2) {
console.log('Meta', 3);
for (let i = 0; i < size; i++) {
console.log(data[i] + size + size);
}
}
}
}
您可以按照以下步骤进行操作:
- 创建一个以
data
、meta
和size
作为三个参数的函数。 - 创建一个空数组来作为结果。
- 然后遍历
meta
数组。 - 然后从开始处获取数组中等于数组大小的部分。
push()
结果数组。 - 从原始数组中删除添加的部分。
- 最后return个结果
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
function parts(data,meta,size){
let res = [];
for(let i = 0;i<meta.length;i++){
res.push(data.slice(0,size * meta[i]));
data = data.slice(meta[i] * size);
}
return res;
}
console.log(parts(data,meta,size))
听起来您只想从 data
中获取大小为 size
的 slice
,如果元标志为真。您应该能够通过简单地遍历 meta
来做到这一点,同时跟踪数据中的当前位置:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
let res = [];
for (let i = 0, cur = 0; i < meta.length; i++){
res.push(data.slice(cur, cur + size * meta[i]))
cur += size * meta[i]
}
console.log(res)
您可以删除内部 if-statements,因为它们是重复的,而是使用变量 i
来打印 i
th 加上一个元值。
在下面的代码片段中,我创建了一个变量 j
,用于跟踪我们在数据中的哪个点。这用于在找到每个 meta
时在 size
的段中跳转。
然后在内部 for 循环中,我从 j
循环到 j+size
,这是长度为 size
.[=20= 的 data
数组的特定部分]
参见下面的示例:
let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
let j = 0;
for (let i = 0; i < meta.length; i++) {
console.log('Meta', i+1);
if (meta[i]) {
for(let k = j; k < j+size && k < data.length; k++) {
console.log(data[k]);
}
j+=size;
} else {
console.log("-- Nothing --");
}
}