2015-07-27 3 views
0

Я пытаюсь подсчитать количество вхождений в одном массиве объектов и вернуть другой массив с этими вхождениями.Подсчет вхождения массива Javascript

var data = [ 
 
    { 
 
     absCost: 0, 
 
     absEndDate: "2014-04-24T00:00:00+01:00", 
 
     absId: "#", 
 
     absMins: 3152, 
 
     absStartDate: "2015-04-08T00:00:00+01:00", 
 
     absType: "Annual Leave", 
 
     absenceReason: "", 
 
     authorise: "Undecided", 
 
     department: "St Catherine's Ward", 
 
     empName: "Alison Lane", 
 
     empNo: " 06547", 
 
     empid: 575, 
 
     status: "", 
 
     year: 2014 
 
    },{ 
 
     absCost: 0, 
 
     absEndDate: "2015-04-24T00:00:00+01:00", 
 
     absId: "#", 
 
     absMins: 3152, 
 
     absStartDate: "2015-04-08T00:00:00+01:00", 
 
     absType: "Annual Leave", 
 
     absenceReason: "", 
 
     authorise: "Undecided", 
 
     department: "St Catherine's Ward", 
 
     empName: "Alison Lane", 
 
     empNo: " 06547", 
 
     empid: 575, 
 
     status: "", 
 
     year: 2015 
 
    }, 
 
    { 
 
     absCost: 0, 
 
     absEndDate: "2015-04-24T00:00:00+01:00", 
 
     absId: "#", 
 
     absMins: 3152, 
 
     absStartDate: "2015-04-08T00:00:00+01:00", 
 
     absType: "Annual Leave", 
 
     absenceReason: "", 
 
     authorise: "Undecided", 
 
     department: "St Catherine's Ward", 
 
     empName: "Alison Lane", 
 
     empNo: " 06547", 
 
     empid: 575, 
 
     status: "", 
 
     year: 2015 
 
    }]; 
 

 

 
var finalArray = []; 
 

 

 
for (var idx=0; i>data.length; i++){ 
 
    finalArray.push({ 
 
    year: data[i].year, 
 
    frequency: //number of occurrences of the Year 
 
    }); 
 
} 
 

 

 
//Hi Would like to get this result: 
 

 
/* 
 
finalArray=[{ 
 
    year: 2014, 
 
    frequency: 1 
 
},{ 
 
    year: 2015, 
 
    frequency: 2 
 
}];  */     
 

 
    

+5

Это хорошо. Удачи с этим. У вас был вопрос программирования? –

+0

, но вы на самом деле не пытаетесь это сделать! BTW это 'i data.length' вы ничего не будете выполнять (если 'idx' должен быть' i', если не вы до сих пор) –

+0

дать 'Array.filter' попробуйте. – Dominofoe

ответ

1

Вы могли бы попробовал немного больше, в любом случае, это очень легкий подход:

var years = []; 

for (var i=0; i<data.length; i++){ 
    years.push(data[i].year); 
} 
years.sort(); 

var finalArray = []; 
var occurence = 1; 
for (var i=0; i<=years.length-1; i++){ 
    console.log(years[i]) 
    if (years[i] === years[i+1]) { 
     occurence += 1; 
    } else { 
     finalArray.push({year: years[i], frequency: occurence}); 
     occurence = 1; 
    } 
} 

DEMO

0
var final = {}; 
for (var i=0; i<data.length; i++){ 
    final[data[i].year] = final[data[i].year] || 0; 
    final[data[i].year]++; 
} 

Это даст вам объект с годами в качестве ключей и числа появлений как значения, и создать пару ключей значение, если он еще не существует.

, если вы хотите, вы можете создать новый массив со свойствами вы хотите:

var finalArray = []; 
for (var key in final) { 
    finalArray.push({year: key, frequency: final[key]}); 
} 
+0

хорошо, если думаю, что 'i> data.length' даже не выполнит первую итерацию –

+0

Вы совершенно правы, я скопировал код и не заметил, я исправил его. Благодаря! – eddyjs

1

Вы можете использовать ассоциативный массив в сочетании с filter() для достижения этой цели:

var dict = {}; 
for (var i=0; i<data.length; i++){ 
    var year = data[i].year; 
    if (!(year in dict)) { 
     dict[year] = data.filter(function(row) { 
      return row.year == data[i].year 
     }).length; 
    } 
} 

jsfiddle

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