我需要确定一个对象是否已经存在于javascript中的数组中.
例如(虚拟代码):
var carBrands = [];
var car1 = {name:'ford'};
var car2 = {name:'lexus'};
var car3 = {name:'maserati'};
var car4 = {name:'ford'};
carBrands.push(car1);
carBrands.push(car2);
carBrands.push(car3);
carBrands.push(car4);
Run Code Online (Sandbox Code Playgroud)
现在"carBrands"数组包含所有实例.我现在正在寻找一个快速的解决方案来检查car1,car2,car3或car4的实例是否已经在carBrands数组中.
例如:
var contains = carBrands.Contains(car1); //<--- returns bool.
Run Code Online (Sandbox Code Playgroud)
car1和car4包含相同的数据但是不同的实例它们应该被测试为不相等.
我是否在创建时向对象添加了哈希值?或者有更快的方法在Javascript中执行此操作.
我在这里寻找最快的解决方案,如果是脏的,那么它必须是;)在我的应用程序中,它必须处理大约10000个实例.
没有jquery
假设我有这个:
var blockedTile = new Array("118", "67", "190", "43", "135", "520");
Run Code Online (Sandbox Code Playgroud)
有更多的数组元素,但为了便于阅读,这些元素很少.无论如何,我可以做一个"for"循环但每次点击地图时它会做500个循环...有没有其他方法可以查看某个字符串是否在数组中?
我正在检查一个变量,例如foo,与多个值的相等性.例如,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
关键是这个繁琐的任务代码相当多.我想出了以下内容:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这并不完全吸引我,因为我必须为对象中的项目提供冗余值.
有没有人知道对多个值进行相等检查的正确方法?
JQuery有两个版本供下载,一个是Production(19KB,Minified和Gzipped),另一个是Development(120KB,Uncompressed Code).
现在是紧凑的19kb版本,如果你下载它,你会看到仍然是一个javascript可执行代码.他们是如何紧凑的呢?我怎么能像这样'缩小'我的代码呢?
如果您在这里阅读jQuery inArray页面上的注释,那么有一个有趣的声明:
!!~jQuery.inArray(elm, arr)
Run Code Online (Sandbox Code Playgroud)
现在,我相信双感叹号会将结果转换为类型boolean,值为true.我不明白的是,~在所有这些中使用了tilde()运算符是什么?
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Run Code Online (Sandbox Code Playgroud)
重构if声明:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Run Code Online (Sandbox Code Playgroud)
分解:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
Run Code Online (Sandbox Code Playgroud)
我也注意到,如果我把波浪号放在前面,结果是-2.
~!!~jQuery.inArray("one", arr) // -2
Run Code Online (Sandbox Code Playgroud)
我不明白这里代字号的目的.有人可以解释一下或指向我的资源吗?
我需要contenteditable像在Gmail备注小部件上一样将插入符移动到节点的末尾.
我在StackOverflow上读取了线程,但这些解决方案基于使用输入,它们不适用于contenteditable元素.
在SQL Server中,我可以说:
WHERE X IN(1,2)
Run Code Online (Sandbox Code Playgroud)
您将如何在JavaScript中重写以下内容:
if (X==1 || X==2) {}
Run Code Online (Sandbox Code Playgroud) 我相信这个问题对于那些玩java script/jquery的人来说相当容易.
var arr = new Array();
$.map(arr, function() {
if (this.id == productID) {
this.price = productPrice;
}else {
arr.push({id: productID, price: productPrice})
}
}
Run Code Online (Sandbox Code Playgroud)
我猜上面的代码以非常简单的方式解释了我想要的东西.我想这个$ .map会像这样工作但不幸的是我无法得到这个结果.
这样做最简单,最优雅的方法是什么?我是否真正通过所有阵列只是为了找出钥匙的价值是否存在?
Jquery有类似的东西isset($array['key'])吗?
编辑
我试图使用inArray,但即使有匹配,它也会不断向数组添加对象.
if ( $.inArray(productID, arr) > -1) {
var number = $.inArray(productID, arr);
orderInfo[number].price = parseFloat(productPrice);
}else {
orderInfo.push({id:productID, price:parseFloat(productPrice)});
}
Run Code Online (Sandbox Code Playgroud) 目前我正在使用forEach()angular 的-method来检查对象数组的新值.但这是错误的方法,因为例如在列表中有20个对象.当我用现有文章创建一个对象时,forEach中的if语句告诉一次该文章存在,而19次则不存在.
以下代码:
var list = [];
articlelist.forEach(function (val) {
list.push(val.artNr);
});
$log.info(list);
Run Code Online (Sandbox Code Playgroud)
在articlelist包含所有20个对象.为了比较我只需要artNr.因为当用户创建新文章时,应该是if-Statement来检查添加的artNr是否已经存在.
$scope.createItem = function (createItem) {
if(list.artNr === createItem.artNr) {
$scope.message = 'artNr already exists!';
}
...
};
Run Code Online (Sandbox Code Playgroud)
问题是,list.artNr返回"undefined",因为list变量是一个数组:
在console =>中列出输出
Array ["AB001", "AB002", "AB003", "AB004"],createItem output:=>
Object { artNr: "AB001", description: "New Article" ...}
如何将新创建的对象与列表变量中的数组进行比较?
我想检查一个数组是否包含"role".如果是这样,我想移动"role"到数组的前面.
var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;
Run Code Online (Sandbox Code Playgroud)
在这里,我得到了结果:
["role", "email", "role", "type", "name"]
我怎样才能解决这个问题?