Проверка двух одинаковых значений в объектах, в массиве

0

У меня есть массив с объектами в нем, который выглядит так:

Изображение 174551

Мне нужно проверить, если какой - либо из start дат совпадают, и если они есть, сделать что - то с этими объектами. Так, например, если arr [0], arr [3], arr [4], все имеют дату начала Пн 25 апреля 2016 года 16:00:00 GMT-0700 (Pacific Daylight Time), тогда мне нужно будет выбрать те 3 объекта и что-то с ними делать.

Я не уверен, как это сделать, любая помощь приветствуется.

  • 2
    Вы можете опубликовать фактический объект? а что ты пробовал?
  • 0
    Вы можете использовать фильтр для извлечения элемента в массиве с точной датой array.filter ((e) => {return e.start === "Пн 25 апреля 2016 16:00:00 GMT-0700 (тихоокеанское летнее время) «});
Теги:
arrays

3 ответа

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
  }
}
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
    }
  }
}
0

Сначала я использовал бы что-то вроде 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);
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню