2016-09-22 2 views
0

Сценарий:Как подсчитать элементы в массиве, как консоли разработчика

vL1 = ["AB", "AB", "AB", "AB", "AB", "CS", "CS", "CS", "ND", "ND"]; 
vL2 = ["1", "1", "1", "2", "3", "1", "1", "2", "1", "1"]; 

for(var i = 0; i < vL1.length; i++){ 
    thing = vL1[i] + " " + vL2[i]; 
    console.log(thing); 
} 

Когда я проверяю консоль разработчика, я вижу следующее:

(3) AB 1 
    AB 2 
    AB 3 
(2) CS 1 
    CS 2 
(2) ND 1 

Как я могу изменить сценарий, так что я может появиться кол-во раз AB с 1 появился или CS с 1 появился в моем коде для использования в других функциях?

Я просто хочу знать количество баллов для каждого vL2, которое представлено в vL1. Важно связать vL1, потому что это позволит мне идентифицировать vL2, так как он не является уникальным.

+0

То есть в консоли разработчика и не могут быть использованы в другой функции. Как я могу получить тот же результат в моем коде, чтобы вставить массив или что-то еще, чтобы его можно было использовать для других функций? – SearchForKnowledge

ответ

1

Вы можете хранить счета в объекте. Кроме того, использование Array.prototype.reduce может сделать его проще для работы с индексами (например, вы не должны обрабатывать увеличивающиеся индекс вручную и т.д.):

vL1 = ["AB", "AB", "AB", "AB", "AB", "CS", "CS", "CS", "ND", "ND"]; 
 
vL2 = ["1", "1", "1", "2", "3", "1", "1", "2", "1", "1"]; 
 

 
var counts = vL1.reduce(function(counts,vL1Element,index) { 
 
    //initialize this index if it isn't set 
 
    if(counts[vL1Element] == undefined) { 
 
    counts[vL1Element] = {}; 
 
    } 
 
    //set this count to 0 if it hasn't been set yet 
 
    if (counts[vL1Element][vL2[index]] == undefined) { 
 
    counts[vL1Element][vL2[index]] = 0; 
 
    } 
 
    counts[vL1Element][vL2[index]]++; 
 
    return counts; 
 
},{}); 
 
console.log(counts);

+0

Спасибо. Это именно то, что мне нужно. Как я могу получить доступ, скажем, счетчик 'AB'' 3'? – SearchForKnowledge

+0

вы можете использовать counts.AB [3] ... –

+0

Надеюсь, это имеет смысл:> Object {Test% 20It% 20Out: Object, Here% 20It% 20Comes: Object ...} Когда я его расширяю, я вижу следующее: > Test% 20It% 20Out: Object > Здесь% 20It% 20Comes: Object Когда я открываю скажем 'Вот% 20It% 20Comes' я вижу следующее: 2: 3 5: 15 10: 2 11: 29 Как мне получить доступ, скажем, 'Здесь% 20It% 20Comes'>' 10' count, что должно дать мне '2'. – SearchForKnowledge

1
var obj={}; 
function log(a){ 
if(obj[a]){ 
    obj[a]++; 
}else{ 
    obj[a]=0; 
} 
} 

А потом сделать:

log(thing); 

Внутри вашего для петли, и чем:

console.log(obj); 

Obj теперь содержит: AB1: 3; ....

+0

Будет ли это для каждой записи? Я могу получить к нему доступ как? Спасибо. Что я передаю 'a'? – SearchForKnowledge

+0

@SearchForKnowledge: Строка, точно так же, как вы делаете это с console.log –

+0

Я получаю 'undefined'. – SearchForKnowledge

2

Вы также можете сделать следующее ;

var vL1 = ["AB", "AB", "AB", "AB", "AB", "CS", "CS", "CS", "ND", "ND"], 
 
    vL2 = ["1", "1", "1", "2", "3", "1", "1", "2", "1", "1"], 
 
result = vL1.reduce((p,c,i) => p[c] ? (p[c][vL2[i]] = p[c][vL2[i]] ? ++p[c][vL2[i]] 
 
                    : 1, p) 
 
            : (p[c] = {[vL2[i]]: 1}, p), {}); 
 
console.log(result);

+0

Спасибо. Как я могу развернуть? – SearchForKnowledge

+1

@SearchForKnowledge В основном это реализация функции [ES6 arrow] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions), переданная как обратный вызов [уменьшить] (https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) вместо итерации 'for' и [тройной] (https://developer.mozilla.org/ tr/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) вместо 'if' и' else'. – Redu

+0

Спасибо. Так что мне было просто любопытно узнать, как получить доступ к счету для AB> 3? Я проверю ссылку, чтобы получить лучшее разъяснение. – SearchForKnowledge

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