Поиск лучшего набора значений в массиве

У меня есть массив, который я хочу проверить на предмет значений во втором и четвертом столбце. Если я перейду к функции GWPA4205022 и 1550 Я хочу, чтобы функция:

  • найти в массиве все совпадения с GWPA4205022
  • найти лучшую комбинацию элементов, сумма которой близка к 1550
  • если это меньше чем 1550 тогда он должен найти другой GWPA4205022 в массиве и поместите его значение, чтобы общая сумма была 1550

поэтому пример вывода должен быть:

var output = [[HAT, GWPA4205022, L00057275, 50.0, , , , 1166P92851, , , , 4720025365 ], [HAT, GWPA4205022, L00063746, 1000.0, , , , 1161P38051, , , , 4720021465 ], [HAT, GWPA4205022, L00063743, 100.0, , , , 1165P95951, , , , 4720024322 ], [HAT, GWPA4205022, L00063743, 100.0, , , , 1166P04351, , , , 4720024534 ], [HAT, GWPA4205022, L00056983, 300.0, , , , 1166P43451, , , , 4720025060 ]];

Функция выполняет свою работу, но мне интересно, есть ли более эффективный способ написать такой макрос?

Я впервые использую такой сложный макрос, поэтому я хотел бы узнать больше о других возможностях, и, возможно, в какой-то части моего кода я ошибаюсь. В некоторых случаях мне удавалось проверить, что он выполняет свою работу.

var arrToCheck = [
["HAT", "GWPA4205022", "L00063746", 1000.0, , , , "1161P38051", , , , 4720021465 ], 
["HAT", "GWPA4205022", "L00063743", 100.0, , , , "1165P95951", , , , 4720024322 ], 
["HAT", "GWPA4205022", "L00063743", 100.0, , , , "1166P04351", , , , 4720024534 ],
["HAT", "GWPA4205022", "L00056983", 300.0, , , , "1166P43451", , , , 4720025060 ],
["HAT", "GWPA4205022", "L00057275", 200.0, , , , "1166P92851", , , , 4720025365 ],
["INT 80C", "CWPA8005121", "L00057064", 600.0, , , , "1166P78351", , , , 4720025137 ], 
["INT 80C", "CWPA8005121", "L00057275", 500.0, , , , "1166P92351", , , , 4720025365 ]
]
var productToCheck = "GWPA4205022";
var sumCheck = 1550;

function item1(valuesToCheck,sumToCheck) {
  const sheetName = "AIRHLP";  // Please set the sheet name.
  const sheetName1 = "対象部品コード";  // Please set the sheet name.
  const sheetName2 = "AIR ";  // Please set the sheet name.

  // 1. Retrieve values from sheet.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);
  const sheet1 = ss.getSheetByName(sheetName1);
  const sheet2 = ss.getSheetByName(sheetName2);
  //const values = sheet.getRange(4, 3, sheet.getLastRow() - 3, 12).getValues();
  //const valuesToCheck = sheet1.getRange(4, 2).getValue();
  //const sumToCheck = sheet1.getRange(4, 3).getValue();
  
  const values = arrToCheck;
  
  console.log(values);

  var arr = [];
  
  for(var i = 0; i < values.length; i++){
      if(values[i][1] === valuesToCheck){
        arr.push(values[i][3]);
      }
  };
console.log(arr);

//------------------------Subset Sum Check--------------------------------------------

function getCombinations(array, sum) {
    function add(a, b) { return a + b; }

    function fork(i, t) {
        var r = (result[0] || []).reduce(add, 0),
            s = t.reduce(add, 0);
        if (i === array.length || s > sum) {
            if (s <= sum && t.length && r <= s) {
                if (r < s) {
                    result = [];
                }
                result.push
            }
            return;
        }
        fork(i + 1, t.concat([array[i]]));
        fork(i + 1, t);
    }

    var result = [];
    fork(0, []);
    return result;
}

const noweAr = getCombinations(arr, sumToCheck);
    var check = noweAr[0];
    console.log(check);

//-------------------------Position in Array---------------------------------------------------------

    function getUniqueIndexes(array, check) {
  // copy array to prevent mutation
  var arr = array.slice()

  // loop through `check`
  const indeks = check.reduce((acc, cur) => {
    // find index of the current value
    var i = arr.indexOf(cur)
    if (i !== -1) {
      // erase the value to prevent further matches
      arr[i] = null
      // return the acumulator with the new index for each loop
      return [...acc, i]
    }
  }, [])

  return indeks
}
const indeks = getUniqueIndexes(arr, check)
    console.log(indeks);

    //-------------------------Total Check----------------------------------------------------------
var sumCheckArray = check.reduce((a, b) => a + b, 0);


    
var first = arr.length;
var second = [];
  for (var i=0;i<=first;i++) {
  second.push(i);
  console.log(second);
}

function arr_diff (a1, a2) {

    var a = [], diff = [];

    for (var i = 0; i < a1.length; i++) {
        a[a1[i]] = true;
    }

    for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
            delete a[a2[i]];
        } else {
            a[a2[i]] = true;
        }
    }

    for (var k in a) {
        diff.push(k);
    }

    return diff;
}

const toLook = arr_diff(second,indeks);
console.log(toLook);

var pasujace = [];
var nowatabelka = [];
var roznica = sumToCheck - sumCheckArray;
    

if(sumCheckArray != sumCheckArray){
  for(var i = 0; i < indeks.length; i++){
   nowatabelka.push(values[indeks[i]]);
}} else {

  for(var i = 0; i < toLook.length; i++){
         
          if(arr[toLook[i]] > roznica){
            pasujace.push(toLook[i],arr[toLook[i]])
          } else if (pasujace === undefined){
            pasujace.push(0,0,3);
          }Logger.log(pasujace);
          values[pasujace[0]][3] = roznica // TUTAJ ZMIENIC
     }
     nowatabelka.push(values[toLook[0]]);
     for(var i = 0; i < indeks.length; i++){
   nowatabelka.push(values[indeks[i]]);
}
}



console.log(pasujace);
  console.log(nowatabelka);
  console.log(nowatabelka.length);

//------------------Insert Data-------------------------------------------
var getLast = sheet2.getLastRow() + 1;
const resultRange = sheet2.getRange(getLast, 3,nowatabelka.length, 12);
  var result = resultRange.setValues(nowatabelka);
  
console.log(getLast);

}

item1(productToCheck, sumCheck);

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *