Вопрос по jquery, json, javascript – Поиск Javascript внутри объекта JSON

32

В моем приложении была строка / объект 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"}
]}

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

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

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

ТАК спрашиватьquestions, Какой у вас вопрос? T.J. Crowder
что вы пробовали до сих пор с поиском? мы помогаем вам с кодом, а не предоставляем его. Joseph
возможный дубликатuse jQuery's find() on JSON object а такжеJSON find in JavaScript Joseph
Я использовал автозаполнение jQuery, чтобы связать мои данные с их встроенной функцией поиска. Это может быть вариант для вас, в зависимости от ваших потребностей.jqueryui.com/demos/autocomplete jmort253
Вы спрашиваете, как искать в JSON (который является строкой) или в объекте (который не имеет ничего общего с JSON)? Предполагая последнее, хотите ли вы вернуть массив объектов с совпадающим именем, или массив только имен, или ...? nnnnnn

Ваш Ответ

6   ответов
33

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

Во-первых, зафиксируйте объект 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/

Error: User Rate Limit Exceeded
0

имеет смысл использовать клиентскую базу данных 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.

Error: User Rate Limit Exceeded
-2

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'));
1

PaulGuo& APOS; sJSQLSQL как база данных с м JavaScript. Например:

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

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

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

A boring old for loop.

On ES5-enabled environments (or with a shim), Array#filter.

Because you're using 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 пропущуmissing записи), измените внутренний возврат на:

        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 && там, если это необходимо.)

Error: User Rate Limit ExceededsourceError: User Rate Limit Exceeded$.mapError: User Rate Limit ExceededsourceError: User Rate Limit ExceededsearchError: User Rate Limit Exceeded
Error: User Rate Limit ExceededsourceError: User Rate Limit ExceededlistError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededsourceError: User Rate Limit Exceeded$.mapError: User Rate Limit ExceededsourceError: User Rate Limit ExceededsourceError: User Rate Limit ExceededobjectError: User Rate Limit Exceeded$.makeArrayError: User Rate Limit Exceeded

Похожие вопросы