Javascript 比较对象数组中的属性值
您好,我正在一个项目中工作,以不断学习js wich位于以下URL中:这是github页面: 在代码的某些部分中,我需要检查对象数组中是否已经存在某些属性,以及属性值是否等于某个值,到目前为止,我用于dis的代码如下:Javascript 比较对象数组中的属性值,javascript,arrays,node.js,object,for-loop,Javascript,Arrays,Node.js,Object,For Loop,您好,我正在一个项目中工作,以不断学习js wich位于以下URL中:这是github页面: 在代码的某些部分中,我需要检查对象数组中是否已经存在某些属性,以及属性值是否等于某个值,到目前为止,我用于dis的代码如下: // check if property value exist in an array of objects function searchByValue(value, property, array){ for(var i = 0; i < a
// check if property value exist in an array of objects
function searchByValue(value, property, array){
for(var i = 0; i < array.length; i++){
if(array[i][property] === value){
return true;
}
}
return false;
}
我的问题是,如果我真的是这样做的,或者如果我错了,因为我有时认为函数没有返回正确的值,或者工作不好,我希望你们中的一些人能给我一些建议,如何实现这一点,或者改进它
编辑
我以类似的方式结束了
Array.prototype.searchBy = function(property, value){
var _property = arguments[0];
var _value = arguments[1];
if(arguments.length === 1){
return Array.prototype.indexOf.apply(this, arguments);
}
for(var i = 0; i < this.length; i++){
if(this[i][_property] === _value ){
return true;
}
}
return false;
};
Array.prototype.searchBy=函数(属性,值){
var_property=参数[0];
var_value=参数[1];
if(arguments.length==1){
返回Array.prototype.indexOf.apply(这是参数);
}
for(var i=0;i
我没有使用checkprop部分,因为实际上我不理解它是如何工作的。非常感谢@gamealchesman和@jshanley,我宁愿将这个函数定义为数组的一种方法,为什么不重载indexOf,它将作为一个参数的std indexOf和indexOf(value,propertyName,checkprop)有三个论点
var __oldIndexOf = Array.prototype.indexOf ;
Array.prototype.indexOf = function() {
if (arguments.length==1) return __oldIndexOf.apply(this, arguments);
var value = arguments[0];
var property = arguments[1];
var checkProp = arguments[2];
if (!checkProp) {
for(var i = 0; i < this.length; i++){
if(this[i][property] === value){
return i;
}
} else {
for(var i = 0; i < this.length; i++){
var thisItem = this[i] ;
if (!Object.hasOwnProperty(thisItem, property))
throw('indexOf error : object ' + thisItem + ' has no property ' + property);
if(this[i][property] === value){
return i;
}
}
return -1;
};
变成:
if (map.markers.indexOf('myDestiny', 'id') != -1 ) { ...
显然,您可以存储找到的索引以备需要。我认为,在您的情况下,您的意思是使用找到的索引:
var destinyIndex = map.markers.indexOf('myDestiny', 'id');
if(destinyIndex != -1){
map.markers[ destinyIndex ].setPosition({
lat: results[0].geometry.location.k,
lng: results[0].geometry.location.A
});
} else {
createMarker(results[0].geometry.location.k, results[0].geometry.location.A,
'myDestiny');
}
编辑:检查属性是否存在的想法来自@jshanley只要您正在搜索的数组中的每个对象都定义了您要检查的属性,您的代码就可以正常工作。我可以预见到在其他方面会遇到问题。在尝试访问属性值之前,您可以尝试添加一个属性已定义的检查,如下所示:
function searchByValue(value, property, array){
for(var i = 0; i < array.length; i++){
// check that property is defined first
if(typeof array[i][property] !== 'undefined') {
// then check its value
if(array[i][property] === value){
return true;
}
}
}
return false;
}
函数searchByValue(值、属性、数组){
对于(var i=0;i
这看起来很棒,我还在考虑扩展阵列的原型,你刚刚读到了我的想法!我会谨慎地修改本机数组的原型。特别是OP提到这个项目是为了继续学习js语言,是一个开源项目。如果其他人看到Array.indexOf
包含多个参数,当这对他们不起作用时,他们可能会感到困惑。@jshanley我忘了提到这一点,恕我直言,如果我改变核心原型,我不会让自己变成蟾蜍。99.999%的项目规模不够大,无法解决这个问题,而从事如此规模项目的人也不会在堆栈溢出问题上寻找这样的答案。你不会变成蟾蜍。在我看来,如果你有很好的理由去做的话,改变原型并没有什么错。我确实认为,当有一个简单的解决方案不改变原型时,应该避免这种情况,但是,这不是我建议尝试学习该语言的人养成的一种习惯。也许我可以添加searchByValue作为另一种方法,而不是覆盖indexOf,如果有人试图使用indexOf来避免问题,你也有点粗鲁:(哈哈哈)
var destinyIndex = map.markers.indexOf('myDestiny', 'id');
if(destinyIndex != -1){
map.markers[ destinyIndex ].setPosition({
lat: results[0].geometry.location.k,
lng: results[0].geometry.location.A
});
} else {
createMarker(results[0].geometry.location.k, results[0].geometry.location.A,
'myDestiny');
}
function searchByValue(value, property, array){
for(var i = 0; i < array.length; i++){
// check that property is defined first
if(typeof array[i][property] !== 'undefined') {
// then check its value
if(array[i][property] === value){
return true;
}
}
}
return false;
}