Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 比较对象数组中的属性值_Javascript_Arrays_Node.js_Object_For Loop - Fatal编程技术网

Javascript 比较对象数组中的属性值

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

您好,我正在一个项目中工作,以不断学习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 < 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;
}