У меня есть массив с объектами в нем, который выглядит так:
Мне нужно проверить, если какой - либо из start
дат совпадают, и если они есть, сделать что - то с этими объектами. Так, например, если arr [0], arr [3], arr [4], все имеют дату начала Пн 25 апреля 2016 года 16:00:00 GMT-0700 (Pacific Daylight Time), тогда мне нужно будет выбрать те 3 объекта и что-то с ними делать.
Я не уверен, как это сделать, любая помощь приветствуется.
Вы можете преобразовать свой список объектов для сопоставления их атрибутом 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
}
}
Сначала пройдите через массив, затем снова запустите с этой точки, проверьте, не является ли какой-либо из запусков одним и тем же...
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
}
}
}
Сначала я использовал бы что-то вроде Lodash _.groupBy()
для создания объекта, где ключ - это дата (в виде форматированной строки или строки числового значения), а значение представляет собой массив объектов с одинаковой датой.
Затем перебирайте объект и если массив значений имеет более одного элемента, сделайте что-нибудь с ним.
например, при использовании 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);
}
});