涉及数组的for循环问题

For-loop issue involving arrays

我正在尝试制作一个基于模拟元数据的 for 循环。

数据代表数据内容

Meta 表示 3 种不同的元数据类型。如果有 1 则表示元数据存在于数据中,如果有 0 则表示它不存在。

Size表示存在元数据时每个数据的大小。因此,如果存在大小为 3 的 1 1 1 的元数据:

我遇到的问题是正确地从左到右按顺序读取它,如果它用完了数据而不是创建新数据,就停止从数组中读取。

如果我们有 [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);
          }
      }
  }
}

您可以按照以下步骤进行操作:

  • 创建一个以 datametasize 作为三个参数的函数。
  • 创建一个空数组来作为结果。
  • 然后遍历 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 中获取大小为 sizeslice,如果元标志为真。您应该能够通过简单地遍历 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 来打印 ith 加上一个元值。

在下面的代码片段中,我创建了一个变量 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 --");
  }
}