Синтаксис запроса объекта 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"
        }
    ]
  1. тип = TP со значением> 30

[type = TP & value> 30] (работает с json-запросом)

  1. тип = 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; });
Другие вопросы по тегам