Home > other >  Get a value from a multidimensional array
Get a value from a multidimensional array

Time:03-15

I have a multidimensional array as follows:

var schMatrix = [
    ['Weight',100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000],
    ['Rate',395,413,484,560,635,691,763,837,910,982,1082,1155,1231,1304,1379,1452,1527,1570,1676,1750],
    ];

In my form the user would input a weight. What I am trying to do is if the weight is equal to or below the number in the weight part of the array that the corresponding rate is assigned to a variable.

Am stuck on how to do this. Any push in the right direction is appreciated.

CodePudding user response:

First of all i would suggest you use a Object instead of a 2d-Array:

let schMatrix = {
    "Weight": [...,...,...],
    "Rate": [...,...,...]
}

Then you can itterate through the "Weight"-Array:

for (let i = 0; i < schMatrix["Weight"].length; i  ) {
    if(schMatrix["Weight"][i] >= inputWeight){
        rate = schMatrix["Rate"][i]
    }
}

CodePudding user response:

You will be better off using a map. They are much faster and you can map each weight to a specific rate:

MAP = {
  100: 395,
  200: 413,
  300: 484,
  etc...
}

map.get(100) //outputs 395

To map the arrays to a map do the following:

let map = new Map();
for(let i = 0; i < arr1.length; i  ){
   map.set(arr1[i], arr2[i]);
}

CodePudding user response:

var schMatrix = [
 ['Weight', 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 
  1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
 ['Rate', 395, 413, 484, 560, 635, 691, 763, 837, 910, 982, 1082, 1155, 
  1231, 1304, 1379, 1452, 1527, 1570, 1676, 1750],
 ]

 function getRate(weight) {
   for (let i = 1; i < schMatrix[0].length; i  ) {
     const currWeight = schMatrix[0][i]
     if (weight > currWeight) {
       // as soon as currWeight is bigger than weight, return
       return schMatrix[1][i-1]
     }
   }
 }

CodePudding user response:

You can do this by finding the corresponding weights and rates columns via the Array.prototype.find method. After that, check if the index plus one (because the label is the first item in the indexing) in "Weight" is less than or equal to the corresponding item in "Rate". Here's the code:

const schMatrix = [
    ['Weight',100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000],
 ['Rate',395,413,484,560,635,691,763,837,910,982,1082,1155,1231,1304,1379,1452,1527,1570,1676,1750],
];

function weightLessThanEqRate(i) {
    const weights = schMatrix.find((item) => item[0] === "Weight");
    const rates = schMatrix.find((item) => item[0] === "Rate");
    return weights[i   1] <= rates[i   1];
}

console.log(weightLessThanEqRate(5));

TypeScript Playground Link

CodePudding user response:

This works, if you assume the weights are sorted already.

function getRate(matrix, target) {
  const [weights, rates] = matrix;
  for (let i = 1; i < weights.length; i  ) {
    if (weights[i] > target) {
      return rates[i];
    }
  }
}

var schMatrix = [
  ['Weight',100,200],
  ['Rate',395,413],
];

const rate = getRate(schMatrix, 110);
console.log(rate); // 413

  • Related