2012-01-12 4 views
1

У меня есть объект, содержащий кучу похожих объектов. Я хотел бы получить счет объекта только для тех, где свойство объекта (статус) имеет заданное значение (true). Так, например, подсчет ниже объекта 3.Получение количества объектов по условию

{ 
6:{"name":"Mary", "status":true}, 
2:{"name":"Mike", "status":true}, 
1:{"name":"John", "status":false}, 
4:{"name":"Mark", "status":true}, 
5:{"name":"Jane", "status":false} 
} 

Благодаря

+2

Вы можете upvote halpful вопросы и ответы (нажав на стрелки), и вы можете принять ответы, которые решают проблему, нажав на Gree галочкой рядом с ним. Это помогает организовать Stackoverflow, а также делает всех счастливыми. – hugomg

+0

Кстати, что вы здесь пробовали? – hugomg

+0

Я сделал следующее, и он работает, но я ожидаю, что будут bettersolutions. Извините за замешанный пост. var count = 0; для (var o in myObject) {count = count + myObject [o] .status;} – user1032531

ответ

1

В частности:

var i = 0; 
var count = 0; 
while (i < array.length) { 
    if (array[i]['status'] == true) count += 1; 
    i += 1; 
} 

В целом, вы можете использовать некоторые функциональное программирование:

function count_matches(array, func) { 
    var i = 0; 
    var count = 0; 
    while (i < array.length) { 
     if (func(array[i])) count += 1; 
     i += 1; 
    } 
    return count; 
} 

function status_true(obj) { 
    return obj['status'] == true; 
} 

count_matches(array, status_true); 

Приведенные выше фрагменты делайте то же самое, но последнее более гибкое/потенциально опрятное.

+0

Вы также можете сделать i ++, чтобы сохранить пару символов. : D – Paul

0

просто перебирайте массив и подсчитывайте, сколько раз свойство status истинно.

var count = 0; 
for (var i = 0; i < yourArray.length; i++){ 
    var current = yourArray[i]; 
    if (current.status) count++ 
} 
0

LinqJs будет работать (может быть слишком много для простого примера, публикуемую в вопросе) -

http://linqjs.codeplex.com/

var jsonArray = [ 
{ "user": { "id": 100, "screen_name": "d_linq" }, "text": "to objects" }, 
{ "user": { "id": 130, "screen_name": "c_bill" }, "text": "g" }, 
{ "user": { "id": 155, "screen_name": "b_mskk" }, "text": "kabushiki kaisha" }, 
{ "user": { "id": 301, "screen_name": "a_xbox" }, "text": "halo reach" }] 


// ["b_mskk:kabushiki kaisha", "c_bill:g", "d_linq:to objects"] 
var queryResult = Enumerable.From(jsonArray) 
.Where(function (x) { return x.user.id < 200 }) 
.OrderBy(function (x) { return x.user.screen_name }) 
.Select(function (x) { return x.user.screen_name + ':' + x.text }) 
.ToArray(); 

// shortcut! string lambda selector 
var queryResult2 = Enumerable.From(jsonArray) 
.Where("$.user.id < 200") 
.OrderBy("$.user.screen_name") 
.Select("$.user.screen_name + ':' + $.text") 
.ToArray(); 
0
var obj = { 
6:{"name":"Mary", "status":true}, 
2:{"name":"Mike", "status":true}, 
1:{"name":"John", "status":false}, 
4:{"name":"Mark", "status":true}, 
5:{"name":"Jane", "status":false} 
}; 
var count = 0; 
for (var prop in obj) { 
    if(obj[prop].status === true){ 
    count += 1; 
    } 
} 
console.log("Output: "+count); 
$("#debug").text("Output: "+count); 

жить демо http://jsbin.com/uwucid/2/edit

3

я признаю вас итерации по объекту, а не массиву, но поскольку другие предоставляют решения для массивов. Я реконструирую решение с массивом. Редукция на месте. Работает в большинстве современных браузеров (IE9 +)

var myArray = [ 
{"name":"Mary", "status":true}, 
{"name":"Mike", "status":true}, 
{"name":"John", "status":false}, 
{"name":"Mark", "status":true}, 
{"name":"Jane", "status":false} 
]; 

var result = myArray.reduce(function(previousValue, currentObject){ 
    return previousValue + (currentObject.status ? 1: 0); 
}, 0);