给定两个数组,我如何遍历一个数组并推入第二个数组的重复元素?

Given two arrays, how can I iterate over one and push to repeated elements of the second?

我正在编写一个 google 应用程序脚本来接收 sheet 行:

StudentName, StudentID, Gender, CoursePreference1, CoursePreference2, CoursePreference 3

并输出:

StudentName, StudentID, Gender, CoursePreference1
StudentName, StudentID, Gender, CoursePreference2
StudentName, StudentID, Gender, CoursePreference3

我正在转换格式,这样我就不会让每个学生在一行中为他们的每个偏好设置一列,而是为每个课程偏好设置一行,并包含重复的学生信息。

我试过使用其他带有嵌套 for 循环的答案和 map 方法来到达我要去的地方,但我完全陷入了困境。

我设置两个数组的代码的前半部分工作正常; studentInfo 的每个元素都旨在为 courseInfo 的关联索引的每个元素重复:

function requestFileConversion() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var input = ss.getSheetByName('Input');
  var output = ss.getSheetByName("Output");

  output.getRange('A2:I').clearContent();
  output.getRange('A2:I').setNumberFormat('@STRING@');

  var studentInfo = input.getRange(2, 1, input.getLastRow() - 1, 8).getValues();
  var courseInfo = input.getRange(2, 9, input.getLastRow() - 1, 23).getValues();

  var appendValues = [];

那么下半场就是我崩溃的地方;我完全无效的尝试如下所示:

 for (var i=0; i < courseInfo.length; i++) {
    var requestCollection = [];
    for (var j=0; j < courseInfo[i].length; j++) {
      requestCollection.push(studentInfo[i] + courseInfo[j]);
    };

if (requestCollection.length > 0) {
Array.prototype.push.apply(appendValues, requestCollection);
};
};

转换的预期结果是从以下形式的一组行中得出:

Jenny, id100, F, English, Science, Math, Physics
Johnny, id101, M, Science, Sports, Gym, English

并生产:

Jenny, id100, F, English
Jenny, id100, F, Science
Jenny, id100, F, Math
Jenny, id100, F, Physics
Johnny, id101, M, Science
Johnny, id101, M, Sports
Johnny, id101, M, Gym
Johnny, id101, M, English

您可以使用destructuring and spread操作,然后映射重组。

data = [
  ['Jenny', 'id100', 'F', 'English', 'Science', 'Math', 'Physics'],
  ['Johnny', 'id101', 'M', 'Science', 'Sports', 'Gym', 'English']
];

result = [];
data.map(row => {
  var [name, id, gender, ...prefs] = row;
  prefs.map((x) => result.push([name, id, gender, x]));
})
console.log(result);

正如评论中指出的那样,由于某些功能might not be available,这里有一个更保守的选择。

data.forEach(function(row) {
  prefs = row.slice(3);  
  prefs.map(function(x) { result.push([row[0], row[1], row[2], x]) });
})

试试这个:

function addingRows() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getRange(2, 1, sh.getLastRow()-1,sh.getLastColumn());
  var vA=rg.getValues();
  var vB=[];
  for(var i=0;i<vA.length;i++) {
    vt=vA[i].slice(3);
    for(var j=0;j<vt.length;j++) {
      vB.push([vA[i][0],vA[i][1],vA[i][2],vt[j]])
    }
  }
  var osh=ss.getSheetByName('Sheet2');
  osh.appendRow(['Name','ID','Gender','Course']);
  osh.getRange(2,1,vB.length,4).setValues(vB);
}

我的工作表 1:

我的工作表 2: