如果两个值都不存在,我如何推入数组?这是我的数组:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
如果我试图再次推入数组的名字:“tom”或文本:“tasty”,我不希望发生任何事情…但如果这两个都不存在那么我就输入。push()
我该怎么做呢?
不确定速度,但stringification + indexOf是一个简单的方法。首先将数组转换为字符串:
let strMyArray = JSON.stringify(myArray);
然后,对于一系列属性-值对,您可以使用:
if (strMyArray.indexOf('"name":"tom"') === -1 && strMyArray.indexOf('"text":"tasty"') === -1) {
myArray.push({ name: "tom", text: "tasty" });
}
查找整个对象更简单:
if (strMyArray.indexOf(JSON.stringify(objAddMe) === -1) {
myArray.push(objAddMe);
}
我知道这是一个非常老的问题,但如果你使用ES6,你可以使用一个非常小的版本:
[1,2,3].filter(f => f !== 3).concat([3])
非常简单,首先添加一个过滤器,删除项目-如果它已经存在,然后通过concat添加它。
下面是一个更现实的例子:
const myArray = ['hello', 'world']
const newArrayItem
myArray.filter(f => f !== newArrayItem).concat([newArrayItem])
如果你的数组包含对象,你可以像这样调整过滤器函数:
someArray.filter(f => f.some(s => s.id === myId)).concat([{ id: myId }])
推送后删除重复项
如果你已经有一个包含重复项的数组,将对象数组转换为字符串数组,然后使用Set()函数消除重复项:
let arr_obj = [
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
let arr_str = arr_obj.map(JSON.stringify)
let arr_unique = [...new Set(arr_str)].map(JSON.parse)
推前检查
如果你到目前为止没有重复的元素,你想在推入一个新元素之前检查重复:
let arr_obj = [
{ name: "tom", text: "tasty" },
{ name: "tim", text: "tusty" }
]
let new_obj = { name: "tom", text: "tasty" }
let arr_str = arr_obj.map(JSON.stringify)
!arr_str.includes(JSON.stringify(new_obj)) && arr_obj.push(new_obj)
这里你有一种方法可以在一行中为两个数组做这件事:
const startArray = [1,2,3,4]
const newArray = [4,5,6]
const result = [...startArray, ...newArray.filter(a => !startArray.includes(a))]
console.log(result);
//Result: [1,2,3,4,5,6]
您可以使用foreach检查数组,然后弹出项目,如果它存在,否则添加新的项目…
newItemValue &submitFields是键值对
> //submitFields existing array
> angular.forEach(submitFields, function(item) {
> index++; //newItemValue new key,value to check
> if (newItemValue == item.value) {
> submitFields.splice(index-1,1);
>
> } });
submitFields.push({"field":field,"value":value});