it-roy-ru.com

Поиск Javascript внутри объекта JSON

В моем приложении была строка/объект JSON. 

{"list": [
    {"name":"my Name","id":12,"type":"car owner"},
    {"name":"my Name2","id":13,"type":"car owner2"},
    {"name":"my Name4","id":14,"type":"car owner3"},
    {"name":"my Name4","id":15,"type":"car owner5"}
]}

В моем приложении был блок фильтра, и когда я вписываю имя в этот блок, мы должны отфильтровать объект и отобразить результат.

Например, если пользователь вводит «name» и нажимает «search», тогда мы должны искать полные имена в объекте JSON и возвращать массив, как при поиске MySQL ...

Мой вопрос состоит в том, чтобы отфильтровать объект JSON со строкой и вернуть массив ....

32
ramesh

Вы можете просто пройтись по массиву и найти совпадения:

var results = [];
var searchField = "name";
var searchVal = "my Name";
for (var i=0 ; i < obj.list.length ; i++)
{
    if (obj.list[i][searchField] == searchVal) {
        results.Push(obj.list[i]);
    }
}
33
McGarnagle

Если ваш вопрос, есть ли какая-то встроенная вещь, которая будет выполнять поиск для вас, то нет, нет. Вы в основном перебираете массив, используя String#indexOf или регулярное выражение для проверки строк.

Для цикла у вас есть как минимум три варианта:

  1. Скучный старый цикл for.

  2. В средах с ES5 (или с прокладкой) Array#filter .

  3. Поскольку вы используете jQuery, jQuery.map .

Скучный старый пример цикла for:

function search(source, name) {
    var results = [];
    var index;
    var entry;

    name = name.toUpperCase();
    for (index = 0; index < source.length; ++index) {
        entry = source[index];
        if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {
            results.Push(entry);
        }
    }

    return results;
}

Где вы бы назвали это с obj.list как source и желаемый фрагмент имени как name.

Или, если есть вероятность, что есть пустые записи или записи без имен, измените if на:

        if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {

Array#filter пример:

function search(source, name) {
    var results;

    name = name.toUpperCase();
    results = source.filter(function(entry) {
        return entry.name.toUpperCase().indexOf(name) !== -1;
    });
    return results;
}

И снова, если есть вероятность, что есть пустые записи (например, undefined, в отличие от пропущенных; filter пропустит пропущенные записи), измените внутренний возврат на:

        return entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1;

Пример jQuery.map (здесь я предполагаю, что jQuery = $, как это обычно бывает; замените $ на jQuery, если вы используете noConflict):

function search(source, name) {
    var results;

    name = name.toUpperCase();
    results = $.map(source, function(entry) {
        var match = entry.name.toUpperCase().indexOf(name) !== -1;
        return match ? entry : null;
    });
    return results;
}

(И снова добавьте entry && entry.name && там, если необходимо.)

31
T.J. Crowder

Используйте PaulGuo 's jSQL , SQL-подобную базу данных, использующую javascript. Например:

var db = new jSQL();
db.create('dbname', testListData).use('dbname');
var data = db.select('*').where(function(o) {
    return o.name == 'Jacking';
}).listAll();
1
JackingLiu

Я адаптировал регулярные выражения для работы с JSON.

Во-первых, зафиксируйте объект JSON. Затем вам нужно сохранить начало и длину соответствующих подстрок. Например:

"matched".search("ch") // yields 3

Для строки JSON это работает точно так же (если только вы не ищете явно запятые и фигурные скобки, в этом случае я бы порекомендовал какое-то предварительное преобразование вашего объекта JSON перед выполнением регулярного выражения (т.е. думаю:, {,}).

Далее вам нужно восстановить объект JSON. Алгоритм, который я создал, делает это путем обнаружения синтаксиса JSON путем рекурсивного возврата назад из индекса соответствия. Например, псевдокод может выглядеть следующим образом:

find the next key preceding the match index, call this theKey
then find the number of all occurrences of this key preceding theKey, call this theNumber
using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times
return this object called parentChain

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

Вы можете увидеть библиотеку и код, который я написал на http://json.spiritway.co/

0
mikewhit

Если вы делаете это более чем в одном месте в вашем приложении, имеет смысл использовать клиентскую базу данных JSON, потому что создание пользовательских функций поиска, которые вызываются array.filter (), является грязным и менее обслуживаемым, чем альтернатива.

Ознакомьтесь с ForerunnerDB, который предоставляет вам очень мощную систему баз данных JSON на стороне клиента и включает в себя очень простой язык запросов, который поможет вам сделать именно то, что вы ищете:

// Create a new instance of ForerunnerDB and then ask for a database
var fdb = new ForerunnerDB(),
    db = fdb.db('myTestDatabase'),
    coll;

// Create our new collection (like a MySQL table) and change the default
// primary key from "_id" to "id"
coll = db.collection('myCollection', {primaryKey: 'id'});

// Insert our records into the collection
coll.insert([
    {"name":"my Name","id":12,"type":"car owner"},
    {"name":"my Name2","id":13,"type":"car owner2"},
    {"name":"my Name4","id":14,"type":"car owner3"},
    {"name":"my Name4","id":15,"type":"car owner5"}
]);

// Search the collection for the string "my nam" as a case insensitive
// regular expression - this search will match all records because every
// name field has the text "my Nam" in it
var searchResultArray = coll.find({
    name: /my nam/i
});

console.log(searchResultArray);

/* Outputs
[
    {"name":"my Name","id":12,"type":"car owner"},
    {"name":"my Name2","id":13,"type":"car owner2"},
    {"name":"my Name4","id":14,"type":"car owner3"},
    {"name":"my Name4","id":15,"type":"car owner5"}
]
*/

Отказ от ответственности: я разработчик ForerunnerDB.

0
Rob Evans