Учитывая два массива, как я могу перебрать один и выдвинуть повторяющиеся элементы второго? - PullRequest
1 голос
/ 23 июня 2019

Я пишу скрипт приложения Google, чтобы взять лист со строками:

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

Ответы [ 2 ]

4 голосов
/ 23 июня 2019

Вы можете использовать деструктурирование и распространение операций, а затем сопоставить для рекомбинации.

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);

Как указано в комментариях, поскольку некоторые функции могут быть недоступны , вот более консервативная альтернатива.

data.forEach(function(row) {
  prefs = row.slice(3);  
  prefs.map(function(x) { result.push([row[0], row[1], row[2], x]) });
})
0 голосов
/ 23 июня 2019

Попробуйте:

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:

enter image description here

Мой лист2:

enter image description here

...