Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подсчет значений (https://javascript.ru/forum/misc/53541-podschet-znachenijj.html)

Denis_Artamonov 08.02.2015 07:44

Подсчет значений
 
Добрый день!

имеется массив:
arNAMES = [
		"Значение1",
		"Значение3",
		"Значение3",
		"Значение1",
		"Значение1",
		"Значение6",
		"Значение6"
		];


нужно посчитать количество одинаковых значений и переписать в новый массив, например:
arNAMES["Значение1"] =3 шт;
		arNAMES["Значение3"] =2 шт;
		arNAMES["Значение6"] =2 шт;


подскажите, как можно это реализовать?

danik.js 08.02.2015 09:03

var arNames = [
        "Значение1",
        "Значение3",
        "Значение3",
        "Значение1",
        "Значение1",
        "Значение6",
        "Значение6"
        ];

var result = arNames.reduce(function(map, item) {
    map[item] = (map[item] || 0) + 1;
    return map;
}, {});
alert(JSON.stringify(result));

Aetae 08.02.2015 09:04

Если значения только текстовые, то просто:
var arNAMES = [
    "Значение1",
    "Значение3",
    "Значение3",
    "Значение1",
    "Значение1",
    "Значение6",
    "Значение6"
];
function calc(arr){
    var out = {};
    arr.forEach(function(val){
        if(val in out) out[val]++;
        else out[val] = 1;
    });
    return out
}

alert(JSON.stringify(
    calc(arNAMES)
,0 , '\t'))

Denis_Artamonov 08.02.2015 11:08

var arNames = [
        "Значение1",
        "Значение3",
        "Значение3",
        "Значение1",
        "Значение1",
        "Значение6",
        "Значение6"
        ];

var result = arNames.reduce(function(map, item) {
    map[item] = (map[item] || 0) + 1;
    return map;
}, {});
alert(JSON.stringify(result));


подскажите, как теперь разложить массив result?
т.е. отдельно ключ и его значение

чтобы далее их можно было обработать, например так:

<span>ключ массива</span>  -  <span>значение ключа</span>

Denis_Artamonov 08.02.2015 18:22

никто не подскажет? :)

freee 08.02.2015 18:59

var arNames = [
        "value1",
        "value3",
        "value3",
        "value1",
        "value1",
        "value6",
        "value6"
        ];
 
var result = arNames.reduce(function(map, item) {
    map[item] = (map[item] || 0) + 1;
    return map;
}, Object.create(null));

s=""
for (i in result) s+="<span>"+i+"</span>\t-\t"+"<span>"+result[i]+"</span>\n"

alert(s)


//  <span>value1</span>	-	<span>3</span>
//  <span>value3</span>	-	<span>2</span>
//  <span>value6</span>	-	<span>2</span>

рони 08.02.2015 19:25

Цитата:

Сообщение от freee
Object.create(null)

а почему не просто {}

freee 08.02.2015 20:02

Цитата:

Сообщение от рони
а почему не просто {}

В случае, если у него расширен Object.prototype свойства попадут в строку. Так надежней.

Aetae 09.02.2015 01:17

рони, новая фича.) Раньше писали __proto__: null. Объект без прототипа - считай таблица.

рони 09.02.2015 01:22

Aetae,
:write: ок буду знать )))


Часовой пояс GMT +3, время: 00:50.