2016-07-04 2 views
-1

У меня есть JSON, где мне нужно сначала сортировать на основе ключевого «имени», и только если имена совпадают, то сначала сортируйте по «дате» ключа с последней датой. Мои JSON-Сортировка Javascript на основе ключа вложенного массива

var jsonResp=[{ 

    "List": [{ 
     "listName": { 
      "name": "abc ", 
      "age": "32 ",   
      "detailInformation": {    
       "date": "Nov 12, 2015"    
      },   
     }, 

    }, 
    { 
     "listName": { 
      "name": "abc ", 
      "age": "32 ",   
      "detailInformation": {    
       "date": "Dec 12, 2016"    
      },   
     }, 
    } 
}] 

Подобно этому, у меня есть три объекта jsonResp массива и каждый объект имеет

Для сортировки выше JSON на основе упомянутого выше требования, я написал JS-

Array.prototype.forEach.call(jsonResp, function(value,key){ 
    var newList = value.List; 
     if(newList.length > 1){ 
      newList.sort(function(a, b) { 

       if (a.listName.name==b.listName.name){ 
       return (b.listName.detailInformation.date - a.listName.detailInformation.date); 
       } else { 
       return (a.listName.name-b.listName.name); 
       }   
      }); 
     } 

}); 

С приведенными выше js, я получаю undefined, а также я не вижу, как сортируется мой массив. Позвольте мне сообщить, где я иду, и как отображать новый отсортированный массив. Большое спасибо. Спасибо заранее! Обратите внимание, что JSON, который я использовал, предназначен только для справки. Просто хотелось убедиться, что я правильно нацеливаю ключи, поскольку встроенная функция сортировки javascript работает только с массивами.

+1

'forEach' не возвращает ничего, что' undefined' – elclanrs

+0

было бы проще, если у вас есть дата в [ISO 8601] (https://en.wikipedia.org/wiki/ISO_8601). –

+0

'sort' мутирует исходный массив, хотя вы уже можете его отсортировать. Вы проверили 'jsonResp' после этого? – elclanrs

ответ

0

ли что-то вроде этого:

var jsonResp = [{ 
 
    "List": [{ 
 
    "listName": { 
 
     "name": "pqr ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Nov 12, 2015" 
 
     }, 
 
     "flag": true 
 
    }, 
 

 
    }, { 
 
    "listName": { 
 
     "name": "abc ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Dec 12, 2016" 
 
     }, 
 
     "flag": true 
 
    }, 
 
    }, { 
 
    "listName": { 
 
     "name": "abc ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Nov 12, 2015" 
 
     }, 
 
     "flag": true 
 
    }, 
 

 
    }, { 
 
    "listName": { 
 
     "name": "pqr ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Nov 12, 2015" 
 
     }, 
 
     "flag": false 
 
    }, 
 

 
    }, { 
 
    "listName": { 
 
     "name": "abc ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Dec 12, 2016" 
 
     }, 
 
     "flag": false 
 
    }, 
 
    }, { 
 
    "listName": { 
 
     "name": "abc ", 
 
     "age": "32 ", 
 
     "detailInformation": { 
 
     "date": "Nov 12, 2015" 
 
     }, 
 
     "flag": false 
 
    }, 
 

 
    }] 
 
}]; 
 

 
Array.prototype.forEach.call(jsonResp, function(value, key) { 
 
    var newList = value.List; 
 
    if (newList.length > 1) { 
 
    newList = newList.sort(function(a, b) { 
 
     var x, y; 
 
     if (a.listName.name == b.listName.name) { 
 
     x = b.listName.detailInformation.date.trim(); 
 
     y = a.listName.detailInformation.date.trim(); 
 
     } else { 
 
     x = a.listName.name.trim(); 
 
     y = b.listName.name.trim(); 
 
     } 
 
     if (x > y) return 1; 
 
     else if (x < y) return -1; 
 
     else return 0; 
 
    }); 
 
    newList = newList.sort(function(a, b) { 
 
     if (a.listName.flag) return -1; 
 
     else if (b.listName.flag) return 1; 
 
     else return 0; 
 
    }); 
 
    
 
    for (var i = 0; i < newList.length; i++) { 
 
     console.log(newList[i].listName.name + newList[i].listName.flag + " "+ newList[i].listName.detailInformation.date); 
 
    } 
 
    } 
 

 
});

+0

Спасибо, просто хотел перекреститься, если мне нужно создать пустой массив и нажимать на него новые элементы, так как прямо сейчас его печатают на консоли. хотел бы, чтобы отсортированный элемент из JSON появился на странице. –

+0

Нет, вам не нужен новый массив. Сам jsonResp получил сортировку, поскольку метод сортировки является изменяемым методом. –

+0

Привет, у меня есть флаг внутри объекта listName, который является ложным для первого объекта, то есть «listName» и true для других двух объектов. Когда значение флага истинно, появляется listName со значениями true. Функция сортировки writtena bove работает нормально но мне нужно сортировать истинную и ложную сортировку отдельно. Любая идея? –

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