Angular.js / Javascript:检查一个对象是否存在于数组的任何元素中

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

本文关键字:数组 元素 任何 于数组 存在 Javascript js 检查 是否 一个对象 Angular      更新时间:2023-09-26

我有一个数组,它的结构是这样的:

$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);

有什么建议吗?

您需要逐个房间迭代,然后检查是否存在。

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));

如果你只是想检查是否有一个房间至少有一个白板,那么你可以简单地使用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);

您可以使用lodash库来查找while board是否存在

$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 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';
});

你可以试试这个类似于你的问题

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'),因为白板不是数组roomlist的直接元素。所以你必须迭代它。使用AngularJS angular.forEach()是最好的方法。

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