Мне нужна ваша помощь. У меня есть например такой массив:
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;
Спасибо
5 ответов
Проверьте эту скрипку
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 );
Здесь 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');
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));
Вы пытаетесь заново изобрести колесо. Этот и многие другие методы предоставляются сторонней библиотекой JS, которая называется «lodash»; старое имя было "подчеркивание". Все его методы или большинство из них выставлены как
_.methodName(listName, iteratorFunction)
Вы можете скачать его по адресу: https://lodash.com/
Как только вы загрузите и включите lodash ваш скрипт в html, перейдите к своей функции и выполните:
_.groupBy(yourArrayVariable, function(item){
return item.year;
});
< STRONG> Внимание Этот метод не возвращает массив. Он вернет JSON, в котором ключи представлены «item.year» через весь исходный массив, а значения будут массивом для каждого года в списке. Каждый такой массив представляет собой список объектов, имеющих одинаковое значение «год»:
{
"2010" : [
{ "name" : "Tony", "year" : "2010" },
{ "name" : "Helen", "year" : "2010" }
],
"2011" : [ ..... ]
}
В любом случае, у Lodash много полезных методов.
Попробуй это:
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 );
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.