按第 1 个列表中的项索引将项目添加到第 2 个列表

Add item to a 2nd list by index of item in the 1st list

提问人:Hack-R 提问时间:10/1/2016 最后编辑:Sushanth --Hack-R 更新时间:10/1/2016 访问量:62

问:

我有 2 个列表。

我有一个 Angular 服务,它有一个基于 的方法,允许我通过操作根据它们的索引从第一个列表(称为“”)中删除项目。spliceitemsng-click

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

我想做的是将已删除的项目添加到第二个列表(称为“”)中,使用传递给 的相同索引。boughtslice

我想也许我可以把这个功能放到同一个函数( )中,如下所示:removeItem

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

然而,这似乎行不通。我尝试了一些变体(如)但没有成功。bought.push(items.itemIndex)

Javascript AngularJS 的

评论


答:

2赞 Sushanth -- 10/1/2016 #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);
};
1赞 Mikkel 10/1/2016 #2

对 splice 的调用会从数组中删除该项,这很好。它返回它删除的元素。在此处查看 doco: 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 函数的功能是纯粹的,并且可以在其他地方使用

评论

0赞 Hack-R 10/1/2016
谢谢迈克。我认为你在第一部分是绝对正确的。我不知道我是否可以将添加和删除分成 2 个不同的功能,因为当单击按钮从第一个列表中删除项目时,它应该出现在第二个列表中。我不想再介绍另一个按钮。或者是否可以赋予 2 个不同的功能?对不起,如果这很明显,我学习 Angular 才一周。ng-click
1赞 Mikkel 10/1/2016
这没什么大不了的,通常有人写服务会建议一个高级级别,因为服务可以很容易地从代码中的其他地方使用——通常人们把实用函数放在服务中。如果你只是给它一个更具描述性的名字,那么它就没问题了。下周你可以成为完全的职业选手:)