如何检查数组中的对象值是否已经使用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);
});
});
你应该知道的第一件事是,在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});
欢迎来到*特权用户*! ;) –
@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)
不知道为什么这是upvoted;它不起作用。除了':'''语法错误外,'filter()'总是返回一个数组 - 甚至是一个空数组。在一个条件中使用一个数组总是等于'true',因此'else'永远不会被命中。 –
对不起,我不好意思,我已经更新了我的答案 –
你应该只使用包括阵列方法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');
});
});
不,只是为了测试。整个事情应该看起来像{产品:XXXXX,数量:XXXX},如果产品已经在阵列中,只需更新数量,如果没有将整个对象保存到数组 –
这个信息实际上完全改变了问题。 –