Логика Inc / dec для обхода нескольких значений массива и сохранения позиции в массиве

#javascript #jquery #arrays

#javascript #jquery #массивы

Вопрос:

У меня есть объект, который содержит 2 массива up и down , эти значения должны быть связаны с клавишами вверх и вниз, при нажатии кнопки вверх вы должны перемещаться по up массиву, если вы ставите галочку вниз, вы должны через любые up значения галочки (если up произошли галочки) перейти к down массиву и наоборот.

Мне удалось создать версию этого, но возникли некоторые проблемы с получением undefined того, что я бы счел точкой пересечения между up и down. Может ли кто-нибудь дать мне несколько советов о том, как сделать это более надежным и решить undefined проблему? Должен ли я начинать с -1 для моего счетчика или каким должен быть подход?

JS

 var prices = {
    "up" : [
      {"r": 10.25, "f" : "10.25"},
      {"r": 10.50, "f" : "10.50"},
      {"r": 10.75, "f" : "10.75"},
      {"r": 11.00, "f" : "11.00"},
      {"r": 11.25, "f" : "11.25"},
      {"r": 11.50, "f" : "11.50"},
      {"r": 11.75, "f" : "11.75"},
      {"r": 12.00, "f" : "12.00"},
      {"r": 12.25, "f" : "12.25"},
      {"r": 12.50, "f" : "12.50"}
    ],
    "down": [
        {"r": 7.50, "f" : "7.50"},
        {"r": 7.75, "f" : "7.75"},
        {"r": 8.00, "f" : "8.00"},
        {"r": 8.25, "f" : "8.25"},
        {"r": 8.50, "f" : "8.50"},
        {"r": 8.75, "f" : "8.75"},
        {"r": 9.00, "f" : "9.00"},
        {"r": 9.25, "f" : "9.25"},
        {"r": 9.50, "f" : "9.50"},
        {"r": 9.75, "f" : "9.75"} 
    ]
};

var $btns = $('.js-btn');
var counter = -1;

$btns.on('click', function(event) {
    var dir = $(event.currentTarget).data('dir');

    if(dir === 'up') {
        if(counter >= -1) {
            console.log(prices[dir][  counter]);
        } else {
            console.log(prices['down'][prices['down'].length   counter  ]);
        }   
    }

    if(dir === 'down') {
        if(counter <= -1) {
            console.log(prices[dir][prices[dir].length   counter--]);
        } else {
            console.log(prices['up'][--counter]);
        }

    }
});
  

JS Fiddle http://jsfiddle.net/kyllle/7Lznj00w /

Комментарии:

1. Вы имеете в виду это jsfiddle.net/7Lznj00w/18

Ответ №1:

Чтобы гарантировать, что ваши обращения к массиву допустимы, вы хотите, чтобы индекс массива находился в диапазоне [0, arr.length-1] . Если вы попытаетесь получить доступ к массиву JavaScript с недопустимым индексом, вы получите undefined.

Вы можете инициализировать свой upIndex и downIndex в 0 (первый элемент в списке). Теперь предположим, что вам нужен следующий элемент в верхнем массиве. Вы можете обновить upIndex следующим образом

 upIndex = (upIndex   1) % prices.up.length
  

% Оператор выдает вам остаток после деления (так 3 % 2 и есть 1 , поскольку 3/2 остается остаток от 1 ). Поэтому, если вы уже находитесь в последнем индексе в up , вы начнете сначала. Последний индекс в up равен 9, а up.length равен 10, поэтому upIndex = (9 1) % 10 = 0 убедитесь, что вы всегда остаетесь в пределах массива.

Комментарии:

1. Эй, план состоит в том, чтобы запросить больше цен, когда я доберусь до верхних областей как восходящего, так и нисходящего массивов, меня больше беспокоит доработка логики для обхода вверх и вниз правильных массивов на основе предыдущего действия — поэтому, если я дважды отмечу вверх, а затем отмечу вниз, я перемещаюсь вниз по восходящему массиву и т. Д

Ответ №2:

 console.clear();

var prices = {
    "up" : [
      {"r": 10.25, "f" : "10.25"},
      {"r": 10.50, "f" : "10.50"},
      {"r": 10.75, "f" : "10.75"},
      {"r": 11.00, "f" : "11.00"},
      {"r": 11.25, "f" : "11.25"},
      {"r": 11.50, "f" : "11.50"},
      {"r": 11.75, "f" : "11.75"},
      {"r": 12.00, "f" : "12.00"},
      {"r": 12.25, "f" : "12.25"},
      {"r": 12.50, "f" : "12.50"}
    ],
    "down": [
    	{"r": 7.50, "f" : "7.50"},
        {"r": 7.75, "f" : "7.75"},
        {"r": 8.00, "f" : "8.00"},
        {"r": 8.25, "f" : "8.25"},
        {"r": 8.50, "f" : "8.50"},
        {"r": 8.75, "f" : "8.75"},
        {"r": 9.00, "f" : "9.00"},
        {"r": 9.25, "f" : "9.25"},
        {"r": 9.50, "f" : "9.50"},
        {"r": 9.75, "f" : "9.75"} 
    ]
};

var $btns = $('.js-btn');
var counter = -1;

$btns.on('click', function(event) {
    var dir = $(event.currentTarget).data('dir');
    
    if(dir === 'up') {
/*use return; to stop or reset counter = -1 | 0*/
if(!prices[dir][counter 1])return;
         counter  ;
        if(counter >= -1) {
            console.log(prices[dir][counter]);
        } else {
        	console.log(prices['down'][prices['down'].length   counter]);
        }   
    }
    
    if(dir === 'down') {
/*use return; to stop or reset counter = -1 | 0*/
if(!prices[dir][counter-1])return;
        counter--;
        if(counter <= -1) {
            console.log(prices[dir][prices[dir].length   counter]);
        } else {
            console.log(prices['up'][counter]);
        }
        
    }
});  
 * {
  -webkit-font-smoothing: antialiased;
}

body {
    padding: 5%;
}  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
    <button class="btn btn-success btn-block  js-btn" data-dir="up">Up</button>
    <button class="btn btn-danger btn-block  js-btn" data-dir="down">Down</button>
</div>  

Комментарии:

1. Эй, это близко, но если я пройдусь по всем нижним значениям, а затем создам резервную копию, я все равно получу неопределенное значение после значения 9.5? { «r»: 9.5, «f»: «9.50» } неопределенное

2. Привет! Похоже, что обновленная версия теперь не проходит через значения down :/

3. Да, обновленный код запрещает устанавливать счетчик отрицательным. Вы хотите сбросить счетчик, если достигнут максимум / минимум?

4. Итак, ваша первая попытка была настолько близка к строке, что 1 не определено, что происходило в какой-то момент, вот подход, который я ищу — нажмите кнопку вверх, переместите 1 в верхний массив, нажмите вниз, переместите 1 в верхний массив, снова нажмите вниз, переместите в нижний массив

5. Возникнут ли у вас какие-либо проблемы с копированием вашего json в новый отсортированный массив, а затем использованием счетчика для перемещения вверх и вниз?