indexof-使用javascript检查数组中是否已有值)

indexof-使用javascript检查数组中是否已有值),javascript,angularjs,Javascript,Angularjs,我正在使用angular,我正在尝试创建一个“全选”按钮 我有一个项目列表,每个项目都有一个切换,我正在做的是,在更改时(每次切换从true(selected)更改为false(notselected),我运行一个函数来创建一个包含所选元素的所有ID的数组 这几乎可以完美地工作,问题是我在使用indexfOf方法检查ID是否已经在数组中时遇到了一些问题 var isInArray; isInArray = function(arr, id) { console.log("index of

我正在使用angular,我正在尝试创建一个“全选”按钮

我有一个项目列表,每个项目都有一个切换,我正在做的是,在更改时(每次切换从true(selected)更改为false(notselected),我运行一个函数来创建一个包含所选元素的所有ID的数组

这几乎可以完美地工作,问题是我在使用indexfOf方法检查ID是否已经在数组中时遇到了一些问题

var isInArray;

isInArray = function(arr, id) {
  console.log("index of ", arr.indexOf(id));
  return arr.indexOf(id);
};


scope.evtSelectAll = function() {
  return angular.forEach(scope.listToDisplay, function(element) {
    element.copyTo = true;
    return scope.selectFromList(element.iID, element.copyTo);
  });
};

scope.selectFromList = function(id, copy) {
  if (copy === true && isInArray(scope.selected, id) === -1) {
    scope.selected.push(id);
  } else {
    scope.selected.pop(id);
  }
  console.log("scope.selected - ", scope.selected);
  if (scope.selected.length > 0) {
    console.log("Emitted event: can proceed!");
    scope.$emit('enough-elements');
  } else {
    console.log("Emitted event: can not proceed!");
    scope.$emit('not-enough-elements');
  }
  return scope.result = scope.selected;
};
我遇到的问题是当数组(scope.selected)有多个ID时

例如,假设my scope.selected如下所示:

scope.selected = [2,3,4,7]
scope.selected = [2,3]
如果单击全选,则不会添加任何内容(这是正确的)

现在,假设我取消勾选4和7,我的scope.selected现在如下所示:

scope.selected = [2,3,4,7]
scope.selected = [2,3]
如果现在单击全选,结果如下:[2,4,7]

我失去了3

我想这是因为我的数组没有一个项目

谢谢您的帮助。这里也有一个快速解释问题的方法。如果您检查控制台并使用开关,您应该能够立即看到我所指的内容


提前感谢

我认为您的代码大多包含逻辑错误。您正在使用功能
selectFromList
取消选择(单独完成时)和全选(您不想使用该功能取消选择)

正如有人在“出于某种原因现在已删除”答案中指出的那样,不应使用任何参数调用函数(它仅用于删除最后一个元素),您应该像这样使用splice:
$scope.selected.splice(isInArray($scope.selected,id),1);

除非您真的需要在“全选”上运行发出的功能,否则您可以尝试以下方法:

var isInArray;

isInArray = function(arr, id) {
  console.log("index of ", arr.indexOf(id));
  return arr.indexOf(id);
};


scope.evtSelectAll = function() {
  return angular.forEach(scope.listToDisplay, function(element) {
    element.copyTo = true;
    if (isInArray($scope.selected, element.id) === -1) {
      $scope.selected.push(element.id);
    }
  });
};

scope.selectFromList = function(id, copy) {
  if (copy === true && isInArray(scope.selected, id) === -1) {
    scope.selected.push(id);
  } else {
    $scope.selected.splice(isInArray($scope.selected, id), 1);
  }
  console.log("scope.selected - ", scope.selected);
  if (scope.selected.length > 0) {
    console.log("Emitted event: can proceed!");
    scope.$emit('enough-elements');
  } else {
    console.log("Emitted event: can not proceed!");
    scope.$emit('not-enough-elements');
  }
  return scope.result = scope.selected;
};

现在,如果在
作用域中找不到id,则全选只会添加到
作用域。selected

感谢MatthiasChristian Bonato的建议

最后,我使用他们的两个建议解决了问题,最终结果似乎如预期的那样有效

这是一个带有最终版本的代码笔:

基本上,我改变了

scope.selected.pop(id);

在selectAll事件函数中,在向数组添加元素之前,我总是清空
作用域。选择[]

$scope.evtSelectAll = function() {
$scope.selected = []
angular.forEach($scope.list, function(element) {
  element.copyTo = true;
  return $scope.selectFromList(element.id, element.copyTo);
});
})


感谢您的帮助!

清空$scope会不会是一个问题。一旦发生切换,请完全选中并通过重新排列列表中选中的元素来重新创建它?不,老实说,我不明白为什么这会是一个问题。我只需要小心,仅在选择所有我猜的选项时清空它,对吗?至少在代码笔示例中,
元素ent.iID
应更改为
element.id
谢谢,我用id更正了iID谢谢你的回答。我添加了你的行,并且我更改了全选函数以包含第一条注释(空范围。单击全选时选中)有了这两个组合解决方案,它可以根据我的需要工作。谢谢。清空数组似乎是解决这个问题的一个很好的方法,很好的工作我只能在两天内接受。我会尽快接受。谢谢