Синтаксис запроса объекта JS - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь найти способ фильтрации коллекции 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. type = TP со значением> 30

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

type = TP со значением> 30 AND type = UU со значением> 90

[type = TP & value> 30 & type = UU со значением> 90] (не работаетс JSON-запросом)

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если коротко взглянуть на страницу 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;
}
0 голосов
/ 18 октября 2018

Я думаю, вы должны использовать 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; });
...