Поиск индекса по точкам останова вместо нескольких операторов else if - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать размеры на основе роста человека. На данный момент моя программа работает, но я хотел бы найти более короткий способ получить размер вместо использования всех этих операторов else if. Я хотел бы l oop через «точки останова», чтобы найти соответствующий индекс.

Это мой исходный код + то, что я имел в виду.

const sizes = ['xxs', 'xxs or xs', 'xs', 'xs or s'] // Goes on for all sizes...

function generateSize(height) {
    let size;

    if (height < 142) {
        size = sizes[0];
    } else if (height >= 142 && height < 148) {
        size = sizes[1];
    } else if (height >= 148 && height < 154) {
        size = sizes[2];
    } else if (height >= 154 && height < 160) {
        size = sizes[3]; // Goes on for all sizes...
    } else {
        size = 'larger...';
    }

    return size;
}



// Example of what I had in mind.
const heightBreakpoints = [142, 148, 154, 160];
function getByBreakpoints(breakpoints, height){ // Part where I am stuck.
    let index;
    // Loop through breakpoints...
    return index;
}
const sizeIndex = (getByBreakpoints(heightBreakpoints, 158));
const s = sizes[sizeIndex];

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Я думаю, вы могли бы значительно упростить это, просто настроив начальную структуру данных. Что, если бы у нас был массив объектов, размер которых t ie вместе и его точка останова:

const sizeMap = [
    { maxHeight: 142, size: 'xxs' },
    { maxHeight: 148, size: 'xxs or xs' },
    { maxHeight: 154, size: 'xs' },
    { maxHeight: 160, size: 'xs or s' },
]

const getSize = height => sizeMap.find(item => height < item.maxHeight).size

console.log(getSize(143))

Функция массива find возвращает первое значение, которое соответствует вашему условию. Предварительным условием для работы этого подхода является указание высоты объекта массива в порядке возрастания.

0 голосов
/ 17 июня 2020

 const sizes = ['xxs', 'xxs or xs', 'xs', 'xs or s', "even another one here"]
// Goes on for all sizes...

function generateSize(height){
    let size;
    let left = 142;
    let right = 142;
    // Initialize the variables for comparison
    // Left and right comparison based on position of "&"
    // This is just user-defined
    for(var i = 0; i < sizes.length; i++){
    	  if(height < right){
    	  	size = sizes[i];
    	  	return size;
    	  }
    	  else {
    	  	  // add counter from here
    	  	  // This takes us to the next item in the array
    	  	  i += 1;
    	  	  // add right comparison with intervals of 6
    	    	right += 6;
            if(height >= left && height < right){
            	  size = sizes[i];
        	      return size;
            }
            else {
            	// add left comparison with intervals of 6
            	left += 6;
            	// revert the counter to its initial value
            	i -= 1;
            }
        }
    }
}
console.log("First: " + generateSize(141))
console.log("Second: " + generateSize(147))
console.log("Third: " + generateSize(153))
console.log("Fourth: " + generateSize(159))
console.log("Last: " + generateSize(161));
// Note this 161, which will return the new last value in the array

Предполагается, что ваши размеры находятся в интервале 6 (каковы они есть), и возвращаются соответствующие значения, соответствующие массиву

0 голосов
/ 17 июня 2020
if(height<160){
height-=142;
if(height<0){size=sizes[0]}
else{
size=sizes[(hieght)%6]
}
}
else{
size='larger...'
}

проверьте, работает ли это во всех случаях Я хочу спать

...