2015-12-18 2 views
2

Мне нужна ваша помощь. У меня есть, например, такой массив:Как подсчитывать объекты со значением элемента?

var array = [{ 
    "name": "Tony", 
    "year": "2010" 
}, { 
    "name": "Helen", 
    "year": "2010" 
}, { 
    "name": "Jack", 
    "year": "2005" 
}, { 
    "name": "Tony", 
    "year": "2008" 
}, { 
    "name": "Max", 
    "year": "2005" 
}]; 

Как я могу сосчитать их по годам и получить что-то вроде этого:

2010 = 2 times; 
2005 = 2 times; 
2008 = 1 time; 

Спасибо вам

+3

** 1. ** Создать объект для хранения счетчика каждого уникального года ** 2. ** Цикл по массиву ** 3. ** Проверьте, если ключ существует в противофазе OBJ , если да increment else добавить как 0. – Tushar

+0

И нет необходимости следовать шагам, у вас есть ответ – Tushar

ответ

1

проверить это fiddle

var countObj = {}; 
for(var counter = 0; counter < array.length; counter++) 
{ 
    var yearValue = array [ counter ].year; 
    if (!countObj[ yearValue ]) 
    { 
     countObj[ yearValue ] = 0; 
    } 
    countObj[ yearValue ] ++; 
} 
console.log(countObj); 
+0

Вы можете попробовать рекурсивную функцию для улучшения кода? –

+0

@ EnriqueQuero вы можете попробовать и опубликовать свой собственный ответ? Если вы обнаружили какие-либо другие проблемы с кодом, пожалуйста, укажите. – gurvinder372

+2

почему эти downvotes? – gurvinder372

1

Попробуйте следующее:

var array = [{ 
    "name": "Tony", 
    "year": "2010" 
}, { 
    "name": "Helen", 
    "year": "2010" 
}, { 
    "name": "Jack", 
    "year": "2005" 
}, { 
    "name": "Tony", 
    "year": "2008" 
}, { 
    "name": "Max", 
    "year": "2005" 
}]; 
var map={} 
for (var i = 0; i<array.length;i++){ 
    if (!map[ array [ i ].year ]){ 
     map[ array [ i ].year ] = 0; 
    } 
    map[ array [ i ].year] ++; 
} 
console.log(map); 

Fiddle

+1

Хороший ответ, он работает –

1

Здесь arrange использует reduce построить объект, используя годы в качестве ключей. Он принимает аргумент prop, чтобы вы могли построить объект по своему усмотрению.

function arrange(arr, prop) { 
    return arr.reduce(function(p, c) { 
    var key = c[prop]; 
    p[key] = p[key] || 0; 
    p[key]++; 
    return p; 
    }, {}); 
} 

Вы можете перебирать ключ/значения этого объекта и распечатать результаты для year:

var obj = arrange(array, 'year'); 
for (var p in obj) { 
    console.log(p + ' = ' + obj[p] + ' times'); 
} 

или даже name:

var obj = arrange(array, 'name'); 

DEMO

0

Вы пытаетесь заново изобрести колесо. Этот и многие другие методы выставляются сторонней библиотекой JS, называемой «lodash»; старое имя было «underscore». Все его методы или большинство из них подвергаются как

_.methodName(listName, iteratorFunction) 

Вы можете скачать его по адресу: https://lodash.com/

После загрузки и включать lodash свой скрипт в HTML, перейдите в вашу функцию и сделать:

_.groupBy(yourArrayVariable, function(item){ 
    return item.year; 
}); 

ВНИМАНИЕ Этот метод не возвращает массив. Он вернет JSON, в котором ключи представлены «item.year» через весь исходный массив, а значения будут массивом для каждого указанного года. Каждый такой массив представляет собой список объектов, имеющих один и тот же «год» значение:

{ 
    "2010" : [ 
     { "name" : "Tony", "year" : "2010" }, 
     { "name" : "Helen", "year" : "2010" } 
    ], 
    "2011" : [ ..... ] 
} 

Lodash имеет много полезных методов в любом случае.

0

var array = [{ 
 
    "name": "Tony", 
 
    "year": "2010" 
 
}, { 
 
    "name": "Helen", 
 
    "year": "2010" 
 
}, { 
 
    "name": "Jack", 
 
    "year": "2005" 
 
}, { 
 
    "name": "Tony", 
 
    "year": "2008" 
 
}, { 
 
    "name": "Max", 
 
    "year": "2005" 
 
}]; 
 

 
var result = {}; 
 
array.forEach(function(data) { 
 
    console.log(data.year); 
 
    result[data.year] = result[data.year] ? ++result[data.year] : 1; 
 
}); 
 

 
document.write(JSON.stringify(result));

Смежные вопросы