Сократить долго, если еще, чтобы получить элемент из массива на основе значения

1

У меня есть массив из семи значений, которые могут или не могут быть расширены. Тогда у меня есть переменная foo которая находится между 1 и -1. На основе foo я выбираю один элемент моего массива, но я не очень доволен текущим решением.

Есть ли предпочтительный способ сделать это?

Пример:

// Of course there useful data in no order like the alphabet
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var foo = myFunc();  // Changes often between about 1 and -1
var index;

if (foo >= 0.1) {
    index = 6;
} else if (foo < 0.1 && foo >= 0.0) {
    index = 5;
} else if (foo < 0.0 && foo >= -0.1) {
    index = 4;
} else if (foo < -0.1 && foo >= -0.2) {
    index = 3;
} else if (foo < -0.2 && foo >= -0.3) {
    index = 2;
} else if (foo < -0.3 && foo >= -0.4) {
    index = 1;
} else {
    index = 0;
}

var element = myArray[index];

Спасибо!

Теги:
arrays
if-statement
indexing

3 ответа

1
Лучший ответ

Вы можете использовать массив и Array#findIndex для получения требуемого номера.

const getIndex = v => [-0.4, -0.3, -0.2, -0.1, 0, 0.1, Infinity].findIndex(a => v < a);

console.log(getIndex(-0.5)); // 0
console.log(getIndex(-0.4)); // 1
console.log(getIndex(-0.3)); // 2
console.log(getIndex(-0.2)); // 3
console.log(getIndex(-0.1)); // 4
console.log(getIndex(0));    // 5
console.log(getIndex(0.1));  // 6
console.log(getIndex(0.2));  // 6
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    Извините за поздний ответ, но я проверил это и мог сделать мой другой код еще меньше! Это огромно ! :)
3

Было бы много способов сделать это, но простой может быть:

index = Math.floor(10 * (0.5 + foo));
if(index > 6)   index = 6;
if(index < 0)   index = 0;
  • 0
    Это JavaScript, там нет int и нет типов. Используйте Math.floor
  • 0
    Слишком быстро, Берги :-)
Показать ещё 1 комментарий
2

Решение 1. Некоторое сравнение не требуется, вот более простая версия:

if (foo >= 0.1) {
    index = 6;
} else if (foo >= 0.0) {
    index = 5;
} else if (foo >= -0.1) {
    index = 4;
} else if (foo >= -0.2) {
    index = 3;
} else if (foo >= -0.3) {
    index = 2;
} else if (foo >= -0.4) {
    index = 1;
} else {
    index = 0;
}

Решение 2:

double pos[6] = {0.1, 0.0, -0.1, -0.2, -0.3, -0.4};
int index = 0;
for (int i = 0; i < 6; i++) {
   if (foo >= pos[i]) {
       index = 6 - i;
       break;
   }
}
  • 2
    пожалуйста, обратите внимание, что вопрос помечен javascript :-)
  • 0
    Мне нравится 2-е решение, хотя его C или тому подобное :) Позвольте мне попробовать!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню