Мне нужна ваша помощь. У меня есть например такой массив:

  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;

Спасибо

2
frostrock 18 Дек 2015 в 12:56

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 );
1
gurvinder372 18 Дек 2015 в 09:59

Здесь 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');

ДЕМО

1
Andy 18 Дек 2015 в 10:41
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));
0
Aitor Aznar Álvarez 18 Дек 2015 в 10:22

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

0
Redd Sanso 18 Дек 2015 в 10:16

Попробуй это:

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

Скрипка

1
Sapikelio 18 Дек 2015 в 10:05