Синтаксис запроса объекта JS
Я пытаюсь найти способ фильтрации коллекции js с синтаксисом запроса, похожим на SQL.
Единственная библиотека, которую я нашел для выполнения этой задачи - это json-query.
Это работает в некоторых случаях, но имеет ограничения. Невозможно выполнить запрос на разных уровнях объекта с одним и тем же запросом или запросить более одного результата.
Вот несколько примеров (возьмите приведенную ниже структуру данных в качестве ссылки)
[{
"type": "UU",
"value": "100",
"tipo": "G",
"strumento": "P",
"aspetto": "C",
"unit": "ml"
},
{
"type": "PS",
"value": "120/88",
"rilevamento": "Manuale",
"lato": "SX",
"part": "Supina",
"unit": "mmHg"
},
{
"type": "TP",
"value": "33.6",
"tipo": "T",
"unit": "°C"
},
{
"type": "VO",
"value": "12",
"tipo": "VOAL",
"unit": "ml"
},
{
"type": "RS",
"value": "60",
"unit": "atti/min"
},
{
"type": "HH",
"value": "180",
"modalita": "R",
"unit": "cm"
},
{
"type": "AA",
"value": "50",
"unit": "cm"
},
{
"type": "PO",
"value": "70",
"rilevamento": "Manuale",
"tipo": "FA",
"sede": "PC",
"unit": "bpm"
}
]
- тип = TP со значением> 30
[type = TP & value> 30] (работает с json-запросом)
- тип = TP со значением> 30 И тип = UU со значением> 90
[type = TP & value> 30 & type = UU со значением> 90](не работает с json-запросом)
2 ответа
Если коротко взглянуть на страницу json-query, я думаю, что ваш второй запрос неверен. Без * запроса вернется только одна запись. Ваш запрос не имеет смысла, вы не можете иметь один элемент с двумя различными типами. Я думаю, что ваш запрос должен выглядеть следующим образом:
[* type = TP & value> 30 | type = UU & value> 90]
Я могу ошибаться, хотя я никогда не работал с этой библиотекой.
Редактировать для комментариев
Вы не можете сделать это с помощью простого запроса, потому что каждый объект проверяется вашим запросом и просто возвращает значение bool, если оно подходит или нет. Вам необходимо отфильтровать данные по первому условию, а фильтр результатов - по второму условию.
var tempData = jsonQuery('[* type = TP & value > 30]', {data: data}).value;
var result = jsonQuery('[* type = UU & value > 90]', {data: tempData }).value;
Редактировать - Возможное решение
Если вам нужно создать запрос заранее, я бы рассмотрел использование массива для хранения одного запроса, а затем применил бы их последовательно. Я не знаю, если вы создаете запрос в JS или на сервере, поэтому я написал его в JS для согласованности кода.
var result;
var queryArray;
queryArray.push("[* type = TP & value > 30]");
queryArray.push("[* type = UU & value > 90]");
for (i = 0; i < queryArray.length; i++) {
result = jsonQuery(queryArray[i], {data: result }).value;
}
Я думаю, что вы должны использовать JsLinq
var myList = [
{FirstName:"Chris",LastName:"Pearson"},
{FirstName:"Kate",LastName:"Johnson"},
{FirstName:"Josh",LastName:"Sutherland"},
{FirstName:"John",LastName:"Ronald"},
{FirstName:"Steve",LastName:"Pinkerton"} ];
var exampleArray = JSLINQ(myList)
.Where(function(item){ return item.FirstName == "Chris"; })
.OrderBy(function(item) { return item.FirstName; })
.Select(function(item){ return item.FirstName; });