如果存在则从数组中删除一个值,如果不存在则将其推向数组

3

我有一个类似于以下的数组定义:

selectedDocumentID = [];

接下来我有一个函数,当我获取ID时会用到它,另一个函数需要我将ID作为参数传递。当我点击具有ID的元素时,该ID将被传递到modifyArray中。 接下来,我使用console.log检查ID(它可以工作并且我可以获取ID)。 之后,我创建了一个包含selectedDocument数组的新数组列表。(它可以工作)。 如果ID不存在,我想将其推送到列表中,如果已存在,则从列表中删除...

modifyArray(id) {
  let selectedDocumentID = [];

  let id = 10;

  console.log('this is: ' + id);
  console.log(this.selectedDocumentID);
  let list = this.selectedDocumentID;

  let index = list.findIndex( x => x === id);
  console.log(index);
  if (index !== id) {
    list.push(id);
    console.log(list);
    this.selectedDocumentID = list;
  }
  else {
    list = list.slice(list.indexOf(id));
    console.log(list);
    this.selectedDocumentID = list;
  }
}

例如,我点击文档id为2、4、5和6的文档。

我的selectedDocumentID=[2,4,5,6],而列表中也有[2,4,5,6]。

接下来,我点击id为8的文档,我的数组变成了[2,4,5,6,8],然后我又点击了id为5的文档,我的数组看起来像是[2,4,6,8]。我做错了什么?

代码示例:


1
当您点击ID为5的文档时,您会得到[2,4,6,8]。这不是您想要的吗? - Ankit Agarwal
是的,这就是我想要的。但是这段代码没有做到:/ - Tomasz Jeznach
4个回答

5
你可以使用xor lodash函数来简化代码。例如:
modifyArray(id) {
  this.selectedDocumentID = _.xor(this.selectedDocumentID, [id]);
}

非常感谢你提供这个宝石,如果你知道数据结构/统计数学的工作原理,你可以做出令人惊叹的事情。 - Lorik

2
您可以尝试以下代码片段。
var index = list.findIndex(x => x==id)
// here you can check specific property for an object whether it exist in your array or not

if (index === -1){
    list.push(id);
}
else console.log("object already exists")

更新 你代码中的问题在于你覆盖了列表。

modifyArray(id) {
  let selectedDocumentID = [];

  let id = 10;

  console.log('this is: ' + id);
  console.log(this.selectedDocumentID);
  let list = this.selectedDocumentID;

  let index = list.findIndex( x => x === id);
  console.log(index);
  if (index !== id) {
    list.push(id);
    console.log(list);
    this.selectedDocumentID = list;
  }
  else {
  list.slice(list.indexOf(id));
    console.log(list);
    this.selectedDocumentID = list;
  }
}

请看代码示例 :) 我尝试了这种方式,当我仅删除'5'时,我得到[5,6,8]。而这并没有切片数组中的5,而是2和3:/ - Tomasz Jeznach
你可以使用切片运算符 list.splice(index, 1)。 - santosh singh
如果我写索引号"1", 我会得到一个空数组。 - Tomasz Jeznach
splice 方法返回从数组中删除的元素。 - santosh singh
我还删除了列表,并仅在this.selectedDocumentID上工作,以避免重复相同的值:P 你帮了我很多:) 并用splice替换slice。使用splice它可以正常工作:) - Tomasz Jeznach

1

你需要使用splice来删除:

list.splice(index, 1);

slice仅提取一部分,我猜你也可以使用它,但是像这样:

list = list.slice(index, index + 1);

1
你也可以通过 JavaScript 实现这个功能。

var tag_story = [];
function checkElemet()
{  
  var  id_tag = document.getElementById("ele").value,
    position = tag_story.indexOf(id_tag); 
  if ( ~position ) tag_story.splice(position, 1);
  else tag_story.push(id_tag);
  console.log(tag_story);
}
<input id="ele" type="text" placeholder="Enter Value"/>
<input type="button" onclick="checkElemet()" value="check"/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接