2013-12-16 6 views
1

Эй у меня есть простой вопрос я не могу найти ответ, я пытаюсь сгенерировать забортные данные для диаграммыJavaScript/JQuery построить массив из массива подсчитывалось

позволяет сказать, что у меня есть массив, как:

[1,0,0,1,2,0] 

Есть ли способ сделать массив из него, который имеет вложенные массивы, которые представляют количество дубликатов записей?

[[0,3],[1,2],[2,1]] 

здесь некоторый код, который делает трюк, но сохраняет количество как объекты

var array = [1,0,0,1,2,0]; 
var length = array.length; 
var objectCounter = {}; 

for (i = 0; i < length; i++) { 

    var currentMemboerOfArrayKey = JSON.stringify(array[i]); 

    var currentMemboerOfArrayValue = array[i]; 

    if (objectCounter[currentMemboerOfArrayKey] === undefined){ 

     objectCounter[currentMemboerOfArrayKey] = 1; 
    }else{ 
     objectCounter[currentMemboerOfArrayKey]++; 
    } 
} 

но objectCounter возвращает их как

{0:3,1:2,2:1} 

, но мне нужно его как массив я указанный выше ?

за любую помощь, заранее спасибо

+1

Вы можете просто преобразуйте его в массив с петлей forin. Или инициализируйте с помощью 'Array()' – Manishearth

ответ

3

Попробуйте

var array = [1, 0, 0, 1, 2, 0]; 

function counter(array) { 
    var counter = [], 
     map = {}, length = array.length; 
    $.each(array, function (i, val) { 
     var arr = map[val]; 
     if (!arr) { 
      map[val] = arr = [val, 0]; 
      counter.push(arr); 
     } 
     arr[1] += 1; 
    }) 

    return counter; 
} 
console.log(JSON.stringify(counter(array))) 

Демо: Fiddle

+0

Да, для меня это идеальное решение! Большое спасибо, а остальные тоже –

+0

Не могли бы вы объяснить, как работает этот код?Я думаю, что довольно интересно, как вы связываете «map [val]» и «arr» с тем же массивом и как вы воспользовались закрытием для хранения переменной «map». – forsvunnet

2

Вы можете превратить ваш объект в массив легко:

var obj = {0:3,1:2,2:1}; 

var arr = []; 
for (var key in obj) { 
    // optional check against Object.prototype changes 
    if (obj.hasOwnProperty(key)) { 
    arr.push([+key, obj[key]]); 
    } 
} 

Примечание: Объект ключи являются строками, поэтому я обратил их обратно на номера при размещении в массив.

1

Try:

var data = [1,0,0,1,2,0]; 
var len = data.length; 
var ndata = []; 
for(var i=0;i<len;i++){ 
    var count = 0; 
    for(var j=i+1;j<len;j++){ 
     if(data[i] == data[i]){ 
      count ++; 
     } 
    } 
    var a = []; 
    a.push(data[i]); 
    a.push(count); 
    ndata.push(a); 
} 
console.log(ndata) 

DEMO here.

1

Прежде всего, необходимо сопоставить массив ассоциативный объект

var arr = [1,0,0,1,2,0]; 
var obj = {}; 
for (var i = 0; i < arr.length; i++) { 
    if (obj[arr[i]] == undefined) { 
    obj[arr[i]] = 0; 
    } 
    obj[arr[i]] += 1; 
} 

Тогда вы можете легко превратить этот объект в 2d матрицы следующим образом:

arr = []; 
for (var k in obj) { 
    arr.push([k, obj[k]]); 
} 

alert(JSON.stringify(arr)); 
1

Ваш существующий объект может быть превращен в массив с помощью простого for..in цикла. Также можно упростить существующий код, создающий этот объект. Инкапсуляция обе части в функции, и вы получите что-то вроде этого:

function countArrayValues(array) { 
    var counter = {}, 
     result = []; 

    for (var i = 0, len = array.length; i < len; i++) 
    if (array[i] in counter) 
     counter[array[i]]++; 
    else 
     counter[array[i]] = 1; 

    for (i in counter) 
    result.push([+i, counter[i]]); 

    return result; 
} 

console.log(countArrayValues([1,0,0,1,2,0])); 

Демо: http://jsfiddle.net/hxRz2/

2

Функциональный способ сделать это, с Array.reduce и Array.map

var data = [1,0,0,1,2,0]; 

var result = data.reduce(function(counts, current) { 
    counts[current] = current in counts ? counts[current] + 1: 1; 
    return counts; 
}, {}); 

result = Object.keys(result).map(function(current){ 
    return [parseInt(current), result[current]]; 
}); 
console.log(result); 

Выход

[ [ 0, 3 ], [ 1, 2 ], [ 2, 1 ] ] 
+0

Хорошее элегантное, функциональное решение! Как я могу адаптировать его для работы, например, из массива букв? –

+0

@i_made_that Что вы хотите в качестве вывода? – thefourtheye

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