繁体   English   中英

Angular.js / Javascript:检查是否在数组的任何元素中找到对象

[英]Angular.js / Javascript: checking if an object is found in any of the elements of an array

我有一个结构如下的数组:

$scope.roomlist = [
    {"roomid":"1", "tablecount":"10", "chaircount":"20", "whiteboards":"2"}, 
    {"roomid":"2", "tablecount":"15", "chaircount":"30", "whiteboards":"2"}, 
    {"roomid":"3", "tablecount":"10", "chaircount":"20"}];

数组值是动态的,并且通过连接某些表来生成数组。 白板是可以在返回的所有房间存在的要素之一roomlist ,在一些房间可能存在如上所示或无的房间全部。

我需要做的只是测试以查看列表中是否至少有一个包含白板对象的房间。

我已经尝试过indexOf测试,但它返回-1。

我执行的代码是

var myrooms = $scope.roomlist; 
var results = myrooms.indexOf("whiteboards");

接着

console.log(results);

有什么建议么?

如果您只想检查一间至少有一个滑水板的房间,则可以简单地使用Array.prototype.some

 var roomlist = [ {"roomid":"1", "tablecount":"10", "chaircount":"20", "whiteboards":"2"}, {"roomid":"2", "tablecount":"15", "chaircount":"30", "whiteboards":"2"}, {"roomid":"3", "tablecount":"10", "chaircount":"20"} ]; var anyRoomWithWhiteBoard = roomlist.some(room => room.whiteboards && parseInt(room.whiteboards) > 0); console.log(anyRoomWithWhiteBoard); 

您需要一个接一个的迭代,然后检查是否存在。

function searchRoomsFor(objectName, roomList) {
  var found = false;
  for (var roomIndex in roomList) {
    var room = roomList[roomIndex];
    if (objectName in room) {
      found = true;
    }
  }
  return found;
}

// Check for an object
console.log(searchRoomsFor('whiteboards', $scope.roomlist));

如果试图在对象数组中查找键的第一个索引,则需要执行循环。

var index = -1;
for (var i = 0; i < $scope.roomlist.length; i++) {
    // check if the whiteboards property is defined
    if (typeof roomlist[i].whiteboards !== 'undefined') {
        var index = i;
        break; // we've found one, stop looping
    }
}
console.log(index);

有一个新的但很少支持的array.findIndex()方法可以将前面的循环简化为下面的循环。 它为每个项目调用一个函数,并返回该函数返回true的第一个项目的索引。

var indexOfWhiteboardRoom = $scope.roomlist.findIndex(function(room, index, arr) {
    return typeof room.whiteboard !== 'undefined';
});    

如果要查找第一个带白板的房间,可以使用array.find() 它为数组中的每个项目调用一个函数,并在函数返回true下返回第一个项目。

var whiteboardRoom = $scope.roomlist.find(function(room, index, arr) {
    return typeof room.whiteboard !== 'undefined';
});

如果要查找所有定义了whiteboard属性的对象,则可以使用array.filter() 它为数组中的每个项目调用一个函数,并且仅返回函数结果为true

var whiteboardRooms = $scope.roomlist.filter(function(room, index, arr) {
    return typeof room.whiteboard !== 'undefined';
});

如果您只是想知道whiteboard存在。

var whiteboardExists = $scope.roomlist.some(function(room, index, arr) {
    return typeof room.whiteboard !== 'undefined';
});

您可以使用lodash库来确定是否存在whilteboard

$scope.roomlist = [{
    "roomid": "1",
    "tablecount": "10",
    "chaircount": "20",
    "whiteboards": "2"
   }, {
   "roomid": "2",
   "tablecount": "15",
   "chaircount": "30",
   "whiteboards": "2"
   }, {
   "roomid": "3",
   "tablecount": "10",
   "chaircount": "20"
}];

var myrooms = $scope.roomlist;
w = _.find(myrooms, function(r) {
    return r.whiteboards
});
if (w) {
    alert("there is a whiteboard");
} else {
    alert("there is no white board")
}

https://jsfiddle.net/phpforyou/jv5hzsvh/

您可以像您的问题一样尝试

var arr = [1, 2, 3];
var check = [3, 4];

var found = false;
for (var i = 0; i < check.length; i++) {
if (arr.indexOf(check[i]) > -1) {
    found = true;
    break;
}
}
console.log(found);

您将无法在$scope.roomlist获得indexOf('whiteboards') ,因为白板不是数组会议室列表的直接元素。 因此,您必须对其进行迭代。 最好使用AngularJS angular.forEach()。

var hasWhiteboards;
angular.forEach($scope.roomlist, function (list) {
  if (list.whiteboards) {
    hasWhiteboards = true;
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM