Добавить элемент во 2-й список по индексу элемента в 1-м списке

#javascript #angularjs

#javascript #angularjs

Вопрос:

У меня есть 2 списка.

У меня есть служба Angular с splice методом на основе a, который позволяет мне удалять элементы из первого списка (называемые « items «) на основе их индекса с помощью ng-click действия.

   service.removeItem = function (itemIndex) {
    items.splice(itemIndex, 1);
  };
  

Что я хотел бы сделать, так это добавить удаленный элемент во 2-й список (называемый « bought «), используя тот же индекс, который передается slice .

Я подумал, что, возможно, я мог бы поместить эту функциональность в ту же функцию ( removeItem ), как это:

   service.removeItem = function (itemIndex) {
    bought.push(itemIndex);
    items.splice(itemIndex, 1);
  };
  

Однако, похоже, это не работает. Я безуспешно попробовал несколько вариантов (например bought.push(items.itemIndex) ).

Ответ №1:

Используется splice для вставки удаляемого элемента с тем же индексом во второй массив.

 service.removeItem = function (itemIndex) {
    var currItem = items[itemIndex];
    // Insert the element to be removed
    // at the same index in the other array
    bought.splice(itemIndex, 0, currItem);
    items.splice(itemIndex, 1);
  };
  

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

 service.removeItem = function (itemIndex) {
    var currItem = items.splice(itemIndex, 1);
    bought.splice(itemIndex, 0, currItem);
};
  

Ответ №2:

Вызов splice удаляет элемент из массива, что хорошо. Он возвращает элемент, который он удалил. Смотрите документ здесь: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

Таким образом, ваша функция removeItem может выглядеть следующим образом:

 service.removeItem = function (itemIndex) {
    var removedItem = items.splice(itemIndex, 1);
    bought.push(removedItem);
};
  

Проблема в том, что вы заставляете метод removeItem выполнять 2 действия одновременно. Возможно, было бы лучше переименовать его, чтобы отразить то, что он делает (например, «buyItem»).

Или иметь функцию более высокого уровня, которая делает это

 service.buyItem = function (itemIndex) {
    bought.push(removeItem(itemIndex);
}
service.removeItem = function (itemIndex) {
    return items.splice(itemIndex, 1);
};
  

Таким образом, ваша функция removeItem является чистой в том, что она делает, и может использоваться в другом месте

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

1. Спасибо, Майк. Я думаю, что вы абсолютно правы в первой части. Я не знаю, смогу ли я разделить добавление и удаление на 2 разные функции, потому что при нажатии кнопки для удаления элемента из первого списка он должен появиться во 2-м списке. Я не хочу вводить еще одну кнопку. Или можно предоставить 2 разные функции ng-click ? Извините, если это очевидно, я всего неделю изучаю Angular.

2. Это не имеет большого значения, обычно кто-то, пишущий сервис, предполагает продвинутый уровень, потому что сервисы можно довольно легко использовать из других мест в коде — обычно люди помещают служебные функции в сервисы. Если вы просто дадите ему более описательное имя, тогда все будет хорошо. Вы можете стать полностью профессионалом на следующей неделе 🙂