检查对象中的两个相等值,在数组

时间:2016-04-21 23:39:23

标签: javascript arrays angularjs

我有一个包含对象的数组,如下所示:

object

我需要检查是否有start个日期相同,如果是,请对这些对象执行某些操作。因此,例如,如果arr [0],arr [3],arr [4]的开始日期都是2016年4月25日16:00:00 GMT-0700(太平洋夏令时),那么我需要选择那些3个物体并用它们做点什么。

我不知道该怎么做,感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您可以通过start属性转换要映射的对象列表,并检查这些日期是否包含多个对象。

这是你的帮手:

function transform(list) {
  var map = {};
  for (var i = 0; i < list.length; i++) {
    var object = list[i];
    if (object.start in map) {
      map[object.start].push(object);
    } else {
      map[object.start] = [];
      map[object.start].push(object);
    }
  }
  return object;
}

然后,您需要做的就是使用您的对象列表调用transform以获取由其开始日期标识的对象地图。通过它们进行迭代,您将获得每个start日期的所有对象。

var startDates = transform(list); // your list of objects mapped by the start date
// loop through each start date
for (var startDate in startDates) {
  var listForStartDate = startDates[startDate];

  // check to see if more than one object exists for this start date
  if (listForStartDate.length > 1) {
    // do whatever you want with your list of objects for the current start date
  }
}

答案 1 :(得分:0)

首先循环遍历数组,然后再从该点开始循环,检查是否有任何相同的开始......

for (var i = 0; i < array.length; i++) {
  var currentObj = array[i];
  for (var j = i + 1; j < array.length; j++) {
    var other = array[j];
    if (currentObj.start === other.start) {
      // do stuff here
    }
  }
}

答案 2 :(得分:0)

我首先会使用像Lodash _.groupBy()之类的东西来创建一个对象,其中键是日期(作为数字值的格式化字符串或字符串),值是一个对象数组同一天。

然后迭代对象,如果值数组有多个元素,则用它做一些事情。

e.g。如果使用Lodash(假设你的对象数组被称为array):

var grouped = _.groupBy(array, function (obj) { return '' + obj.start.getTime(); });
_.each(grouped, function (objects, date) {
    if (objects.length > 1) {
        doSomething(objects);
    }
});

如果不使用Lodash / Underscore,您只需滚动自己的分组功能:

function groupBy(collection, callback) {
    var output = {};
    angular.forEach(collection, function (obj) {
        var groupKey = callback(obj);
        if (!output[groupKey]) {
            output[groupKey] = [obj];
        } else {
            output[groupKey].push(obj);
        }
    });
    return output;
}

// to use it:

var groupedByDate = groupBy(array, function (obj) { return '' + obj.start.getTime(); });
angular.forEach(groupedByDate, function (objects, date) {
    if (objects.length > 1) {
        doSomething(objects);
    }
});