如何检查数组中的对象值是否已经使用jquery存在

问题描述:

如何检查数组中是否存在对象值exstis? 如果不推的值如何检查数组中的对象值是否已经使用jquery存在

小提琴:https://jsfiddle.net/h9zctLqz/

HTML:

<form> 
    <input type="text" id="input" name="input"> 
    <button type="button" name="save">save</button> 
</form> 

的jQuery:

$('document').ready(function(){ 
    $myData = []; 

    $('button[name=save]').on('click', function(){ 
     var input = $('#input').val(); 
      $myData.indexOf({'input':input}) === -1 ? $myData.push({'input':input}) : console.log('already exists'); 
     console.log($myData); 
    }); 
}); 
+0

不,只是为了测试。整个事情应该看起来像{产品:XXXXX,数量:XXXX},如果产品已经在阵列中,只需更新数量,如果没有将整个对象保存到数组 –

+0

这个信息实际上完全改变了问题。 –

你应该知道的第一件事是,在javascript:

({ 'input': input} === { 'input': input }) // returns false 

===比较对象引用,而不是对象的外观。

这意味着indexOf({input: input})从来没有返回除-1以外的任何东西。

您可以使用some解决此问题。 some需要函数来比较内容,因此您可以编写自己的“等号”(而不是indexOf,使用===)。

if ($myData.some(item => item.input === input)) console.log("exists") 
else $myData.push({input: input}); 
+1

欢迎来到*特权用户*! ;) –

+1

@Jonasw很好看!谢谢:) – user3297291

尝试:

if(myArray.find(x => x.input === input)){ 
console.log("Exist"); 
} else{ 
anotherarray.push({'input':input}); 
} 

find() 方法数组中返回一个值,如果在阵列 满足的元件所提供的测试功能。否则undefined是 返回。

如果你想获得匹配元素的数组,使用 filter() 方法代替:

myArray.filter(x => x.id === input) 

如果你想获得的another property性能数组,你可以做 这与 map() 方法:

myArray.filter(x => x.id === input).map(x => x.anotherproperty) 
+2

不知道为什么这是upvoted;它不起作用。除了':'''语法错误外,'filter()'总是返回一个数组 - 甚至是一个空数组。在一个条件中使用一个数组总是等于'true',因此'else'永远不会被命中。 –

+0

对不起,我不好意思,我已经更新了我的答案 –

你应该只使用包括阵列方法array.includes(一些值),然后,如果它不包括充当包括返回一个布尔值,你可以把。请注意,这是纯Javascript。 Array includes method

let array = [1, 2, 3, 4, 5]; 
 
console.log(array) 
 
if (array.includes(2)) { 
 
    array.push(20); 
 
} 
 
console.log(array)

这些对象将有两个不同的引用,以便它总是返回false。 使用.some或.find并对.input字段进行值比较。

const itemExists = $myData.some(el => el.input === input); 
if(itemExists) { 
    console.log("Already exsists"); 
} 
else { 
    $myData.push({'input':input}) 
} 

看起来像一个哈希表完美的用例:

var hash={},result=[]; 

$('button[name=save]').on('click', function(){ 
    var input = $('#input').val(); 
    if(hash[input]){ 
     hash[input].quantity++; 
    }else{ 
     result.push(hash[input]={input,quantity:1}); 
    } 
}); 

的indexOf效果很好用字符串,而是一个数组,你不能简单地使用它内检查。

其他方法可能会迭代整个数组并检查,但这在时间复杂度方面会非常昂贵。

所以最好的答案是在这种情况下使用简单的地图。请尝试以下 -

$('document').ready(function(){ 
var myData = new Object(); // or var map = {}; 

$('button[name=save]').on('click', function(){ 
    var input = $('#input').val(); 
     if(myData[input] != input) 
      myData[input] = input; 
     else 
      console.log('already exists'); 


}); 
});