2015-01-09 3 views
0

У меня есть следующий массив, возвращенный из PHP-скрипта.Как я могу найти объект в массиве с помощью свойства?

$data = [ 
    { 
     "id": "1", 
     "created_at": "2015-01-02 15:17:29", 
     "updated_at": "2015-01-02 15:17:29", 
     "name": "Minecraft", 
     "description": "", 
     "location": "ideaLab", 
     "cost": "20.00", 
     "min_age": "7", 
     "max_age": null, 
     "start_date": "2014-11-06", 
     "end_date": "2014-12-11", 
     "start_time": "16:30:00", 
     "end_time": "17:30:00", 
     "registration_start_date": "2014-10-28", 
     "registration_end_date": "0000-00-00", 
     "program_id": "1", 
     "max_attendees": "12" 
    }, 
    { 
     "id": "2", 
     "created_at": "2015-01-02 15:17:29", 
     "updated_at": "2015-01-02 15:17:29", 
     "name": "Mini Makers", 
     "description": "", 
     "location": "ideaLab", 
     "cost": "18.00", 
     "min_age": "9", 
     "max_age": "7", 
     "start_date": "2014-11-04", 
     "end_date": "2014-12-09", 
     "start_time": "16:30:00", 
     "end_time": "17:30:00", 
     "registration_start_date": "2014-10-28", 
     "registration_end_date": "0000-00-00", 
     "program_id": "2", 
     "max_attendees": "20" 
    } 
]; 

Как выбрать объект по id? что-то вроде SQL-эквивалента $obj = select * where id=$id, если это имеет смысл.

+1

траверс массива? Btw - это только JSON, если это строка. После синтаксического анализа это простой объект JavaScript. – Sirko

+0

проверить эту ссылку http://stackoverflow.com/a/7026711/1303429 – malkassem

+0

просто поместите их все в список итерации по ним до тех пор, пока вы не найдете его или не используйте карту. – Lucas

ответ

5

Вы можете использовать обобщенную функцию, которая принимает id в качестве аргумента и возвращает объект (если идентификатор существует)

function getObjectById(id) { 
    for (var i = 0; i < $data.length; i++) { 
     if ($data[i]['id'] === id) { 
     return $data[i]; 
     } 
    } 
    return {}; 
} 

, но если ваш вывод, что это именно то, что вы писали, и вы не хватает id в последовательности можно просто уменьшить тело функции

return (id > 0 && id <= $data.length) ? $data[id - 1] : {} 

(в данном случае я предполагаю, что вы передаете целое число как id)

+1

Самый прямой ответ, но я бы, вероятно, вернул 'null', если не нашел – Rhumborl

+1

Я бы сделал == вместо ===, потому что id является строкой и может использоваться как число? – Hacketo

+1

@Hacketo Я просто предпочитаю по умолчанию строгое сравнение. до тех пор, пока значения все строки и вы передаете строку как параметр, тогда '===' is fine – fcalderan

-2

Вы могли бы использовать:

$data[0].id 

Таким образом, чтобы получить объект по его ID:

$data[$id+1] //so long as their position in the array is not shuffled. 

Или до тех пор, как вы используете JQuery, что-то, как это должно быть полезно:

$.each(data, function(index) { console.log(data[i].id); }); 
+3

Это получает идентификатор каждого объекта. OP хочет найти весь объект по его идентификатору. –

+0

Отмечено и уточнено. –

+1

Должно быть $ id - 1, я думаю. – Hacketo

3

Вы можете использовать небольшой скрипт так:

function findJSONById(needle, jsonString) 
{ 
    var finalJSON = {}; 
    $.each(JSON.parseJSON(jsonString), function (key, value) { 
    if (value["id"] == needle) 
    { 
     finalJSON = value; 
     return false; // break the loop 
    } 
    }); 
    return finalJSON; 
} 
+2

'return' не возвращается из внешней функции. – Sirko

+0

@Sirko Обновлено. ':)' –

+1

Кроме того, я добавил несколько ключевых слов. – Sirko

1

Если вы используете JQuery есть хорошая функция: $.grep

фильтрует входной массив, основанный на функции фильтра.

var objectWithId2 = $.grep(data, function (obj) { 
    return obj.id == 2; 
})[0]; 
0

Попробуйте

var filtered = function(data, id) { 
    return data.filter(function(items, i) { 
    return items.id === id 
    }) 
}; 

console.log(filtered("1")); 
Смежные вопросы