2013-07-10 1 views
0

Я пытаюсь получить «заголовок» вложенного массива, где была найдена совпадающая дата ... но безрезультатно.Как найти «название» многомерного массива, где значение было найдено?

Если дата найдена в массиве, она должна предупредить «ИСТИНА». Дата должна соответствовать или находиться в пределах диапазона дат. Когда он будет найден, я хотел бы получить «Заголовок» вложенного массива, где он был найден, чтобы соответствовать. (IE. Дата «10/29/2013» находится в соответствии с «Лицом 2». Я также хотел бы сказать это название.

Я сейчас просматриваю оба вложенных массива, чтобы проверить совпадение даты. В конце концов, у них будет намного больше людей и раз. Следует отметить, что в течение времени в массиве не будет отображаться дважды. Это будет использоваться для отображения того, кто доступен в течение этого времени на веб-странице. было бы гораздо лучше маршрут пойти, это сидит на ЭВМ и не будет привязан к DB2.

Если есть более простой способ идти о том, что я все уши, а также.

var data = [] 
var data = [ 
    {title:'Person 1',contents:[ 
     {primary:"7/09/2013"},{primary:"7/22/2013"},{primary:"10/15/2013"},{primary:"10/28/2013"},{primary:"1/21/2014"},{primary:"2/03/2014"}]}, 
    {title:'Person 2',contents:[ 
     {primary:"7/23/2013"},{primary:"8/05/2013"},{primary:"10/29/2013"},{primary:"11/11/2013"},{primary:"2/04/2014"},{primary:"2/17/2014"}] 
    } 
]; 

Array.prototype.between = function(arg) { 
for(var i=0, j=data.length; i < j; i++){ 
    for(var p=0, plen=data[i].contents.length; p < plen; p++){ 
     var d1 = new Date(data[i].contents[0].primary), 
      d2 = new Date(data[i].contents[1].primary), 
      d4 = new Date(data[i].contents[2].primary), 
      d5 = new Date(data[i].contents[3].primary), 
      d3 = new Date(arg); 
     } 
     //alert(data[i].title); //Using "data[i].title" will grab both titles but I only need one. 
    } 
return ((d1.getTime() <= d3.getTime() && d3.getTime() <= d2.getTime()) || (d4.getTime() <= d3.getTime() && d3.getTime() <= d5.getTime())); 
} 

alert(data.between("10/29/2013")); 

И скрипка ...

http://jsfiddle.net/sherman2k2/E3ASy/1/

+0

Если вы сделали даты массивом вместо объектов с повторным ключом, было бы проще закодировать вашу логику. – dandavis

+0

Ваш код для меня не имеет смысла. Каждый раз через этот внутренний цикл вы возвращаете значения всех этих «d» переменных. В конце функции значения будут соответствовать значениям последней итерации цикла. – Pointy

ответ

1

Я уверен, что ваш код должен выглядеть следующим образом:

Array.prototype.between = function(arg) { 
    for(var i=0, j=data.length; i < j; i++){ 
     for(var p=0, plen=data[i].contents.length; p < plen; p++){ 
      var d1 = new Date(data[i].contents[0].primary), 
       d2 = new Date(data[i].contents[1].primary), 
       d4 = new Date(data[i].contents[2].primary), 
       d5 = new Date(data[i].contents[3].primary), 
       d3 = new Date(arg); 
      if ((d1.getTime() <= d3.getTime() && d3.getTime() <= d2.getTime()) || (d4.getTime() <= d3.getTime() && d3.getTime() <= d5.getTime())) 
       return data[i].title; 
     } 
    } 
} 

При вызове функции, она будет возвращать либо название или undefined, если дата не совпадает.

+0

Это в основном то, что я искал. Я уверен, что мой код не был в лучшем формате, но я использовал несколько его версий и начал немного потеряться в коде. Это помогает вернуть меня на путь. –

Смежные вопросы