У меня есть следующий формат JSON:
[{
"-KQVfnf1ZCml7dZ1dZAC": {
"content": {
"data": "New Order",
"type": "text/plain"
},
"conversation_id": "990",
"is_admin": false,
"is_announce": false,
"is_deleted": false,
"message_id": "9694",
"sender": {
"name": "Paras",
"user_id": "285"
},
"sent_at": "1472648381032"
},
"-KQVgEHps9L3l80nmkWb": {
"content": {
"data": "New Shipment",
"type": "text/plain"
},
"conversation_id": "990",
"is_admin": false,
"is_announce": false,
"is_deleted": false,
"message_id": "9694",
"sender": {
"name": "Paras",
"user_id": "285"
},
"sent_at": "1472648431073"
},
"created_at": "1472647272113",
"$id": "messages",
"$priority": null
}]
Теперь я использую Angular для получения части данных, которые мне нужны из массива JSON.
Угловой код:
$scope.user_message = [];
$scope.user_content = [];
angular.forEach($scope.messages, function(value, key){
$scope.user_message.push(value);
angular.forEach($scope.user_message, function(value, key){
$scope.user_content.push(value[key]);
console.log($scope.user_content);
});
});
Данные, которые я хочу извлечь из JSON:
{
"content": {
"data": "New Order",
"type": "text/plain"
},
"conversation_id": "990",
"is_admin": false,
"is_announce": false,
"is_deleted": false,
"message_id": "9694",
"sender": {
"name": "Paras",
"user_id": "285"
},
"sent_at": "1472648381032"
}
Итак, в основном я хочу все, что из массива JSON, кроме ключа идентификатора сообщения, который начинается с -KQV...
Но он всегда возвращает Key: 0 Value: [object Object].
Может ли кто-нибудь помочь мне с решением?
Вы можете использовать Object.keys(object).foreach()
для итерации по каждому ключу объекта и проверки, начинается ли имя объекта с -KQV
. Если это так, используйте этот объект. Это даст вам определенную часть каждого массива, который вы хотите. Здесь я $scope.user_message
его на консоли и $scope.user_message
массив $scope.user_message
.
$scope.user_message = [];
for (var i=0; i < $scope.messages.length; i++) {
Object.keys($scope.messages[i]).forEach(function(key,index) {
if (key.substr(0, 4) == '-KQV') {
console.log($scope.messages[i][key]);
$scope.user_message.push($scope.messages[i][key]);
}
});
}
Не совсем уверен, что вам нужно, было бы неплохо, если бы вы могли расширить свой массив сообщений с помощью более типовых сообщений и обеспечить ожидаемый результат. Эта версия вашего кода запишет все объекты в каждом сообщении в $ scope.user_content (у него нет чеков для "KQV"):
$scope.user_message = [];
$scope.user_content = [];
angular.forEach($scope.messages, function(value, key){
$scope.user_message.push(value);
angular.forEach(value, function(value1, key1){
if (value1 === null || typeof value1 !== 'object') return;
$scope.user_content.push(value1);
});
});
console.log($scope.user_content);
Скрипт: http://jsfiddle.net/b2gy2yr1/
Я бы также рекомендовал посмотреть на lodash - это облегчает такие задачи: https://lodash.com/docs/4.15.0
Это короче, но предполагает, что первый элемент массива JSON всегда содержит сообщения:
//var j = JSON.parse(...)
for (key in j[0]) {
if (j[0].hasOwnProperty(key) && (key != "created_at") && (key != "$id") && (key != "$priority")) {
console.log(j[0][key]);
}
}
Он также черным списком ключей, которые, как мы уверены, не являются сообщениями ("created_at" и т.д.) Вместо белого списка тех, которые начинаются с определенной строки ("-Kv"), которая может в конечном итоге измениться.