Подтвердить что ты не робот

Поиск 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"}
]}

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

Например, если пользователь набирает имя и находит поиск, нам нужно искать полные имена в объекте JSON и возвращать массив, как и поиск в MySQL...

Мой вопрос заключается в фильтрации объекта json со строкой и возврате массива....

4b9b3361

Ответ 1

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

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]);
    }
}

Ответ 2

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

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

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

  • В средах с поддержкой ES5 (или с помощью прокладки) Array#filter.

  • Поскольку вы используете 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 example (здесь я предполагаю 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 && туда, если это необходимо.)

Ответ 3

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

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

Ответ 4

Если вы делаете это более чем в одном месте в своем приложении, имеет смысл использовать базу данных 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.

Ответ 5

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

Сначала стягиваем объект JSON. Затем вам нужно сохранить начальные и длинные совпадающие подстроки. Например:

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

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

Затем вам нужно восстановить объект 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/

Ответ 6

Вы можете попробовать следующее:

function search(data,search) {
    var obj = [], index=0;
    for(var i=0; i<data.length; i++) {
      for(key in data[i]){
         if(data[i][key].toString().toLowerCase().indexOf(search.toLowerCase())!=-1) {
                obj[index] = data[i];
                index++;
                break;
         }
     }
     return obj;
}
console.log(search(obj.list,'my Name'));