计算来自一个阵列的单词在第二个阵列中出现的次数

时间:2016-01-27 22:31:47

标签: javascript arrays

所以你有两个数组。搜索第二个数组并计算第一个数组中每个单词在第二个数组中出现的次数。显示第二个数组中所有单词的可滚动列表及其来自第一个数组的计数。我不想只显示重复的值,因此交集函数无济于事。仅使用javascript。

例如:

listOne = [Pat, cat, hat, Tat, bat, rat];
listTwo = [Pat, mat, sat, rat, cat, Tat, Pat];

输出如下:

Pat: 2
mat: 0
sat: 0
rat: 1
cat: 1
Tat: 1

我尝试过多种方式,而我最接近的就是:

function findFreq(listOne, listTwo, concatList) {
  var a = [], b = [], lookup = {}, prev;

  for(var j = 0; j < listTwo.length; j++) {
      lookup[listTwo[j]] = listTwo[j];
  }

  for (var i = 0; i < concatList.length; i++ ) {
      if (concatList[i] !== prev) {
          a.push(lookup[concatList[i]]);
          b.push(0);
      } else {
          b[b.length - 1]++;
      }
      prev = concatList[i];
  }

      return [a, b];          
  }

var result = findFreq(listOne, listTwo, concatList);
alert('[' + result[0] + ']<br />[' + result[1] + ']');

正如你所看到的,我认为将两个数组相结合是最简单的,因为我发现计算元素出现的所有例子只涉及一个数组。事实上,我从here获取了代码并尝试修改它以满足我的需求。

问题是输出给了我空的或额外的元素。

[Pat,Tat,,cat,,mat,rat,sat]
[2,1,0,1,0,0,1,0]

所以答案是错误的,格式也是如此。我可能过于复杂了。直接比较两个数组可能更容易,但我无法弄明白。任何帮助将不胜感激。

注意:对于我的程序,我使用的两个数组实际上来自用户指定的文件,我只使用了split()函数。这就是为什么我的命名惯例很奇怪。

5 个答案:

答案 0 :(得分:2)

只需遍历两个数组。这样的事情应该有效:

listOne = ["Pat", "cat", "hat", "Tat", "bat", "rat"];
listTwo = ["Pat", "mat", "sat", "rat", "cat", "Tat", "Pat"];


for(var i = 0; i < listOne.length; i++) {
    matches = 0;
    for(var j = 0; j < listTwo.length; j++) {
    if(listOne[i] == listTwo[j]) {
        matches++;
    }
  }
  console.log(listOne[i] + ' has '+ matches+ ' occurance(s)')
}

您可以在此处看到它:https://jsfiddle.net/igor_9000/9n883kse/

希望有所帮助!

答案 1 :(得分:0)

var listOne = 'pat, cat, hat, tat, bat, rat'.split(', ');
var listTwo = 'pat, mat, sat, rat, cat, tat, pat'.split(', ');

// “Count how many times each word from the first array occurs in the second one.”
var results = listOne
  .reduce(function(prev, current) {
    if(!prev[current]) {
      prev[current] = (prev[current] || 0) 
        + listTwo.filter(function(item) { return current === item; }).length;
    }
    return prev;
  }, {});

返回

{
  "pat": 2,
  "cat": 1,
  "hat": 0,
  "tat": 1,
  "bat": 0,
  "rat": 1
}

然后您可以将HTML构建为字符串,例如

var htmlStr = Object.keys(results)
  .map(function(key) {
    return '<tr><td>'+key+'</td><td>'+results[key]+'</td></tr>';
  })
  .join('\r');

会产生

'<tr><td>pat</td><td>2</td></tr>
<tr><td>cat</td><td>1</td></tr>
<tr><td>hat</td><td>0</td></tr>
<tr><td>tat</td><td>1</td></tr>
<tr><td>bat</td><td>0</td></tr>
<tr><td>rat</td><td>1</td></tr>'

(因为我的换行,我一直很快和松散,但你明白了。)

答案 2 :(得分:0)

使用Array.prototype.map()创建计数数组,Array.prototype.reduce()进行计数

listOne = ["Pat", "cat", "hat", "Tat", "bat", "rat"];
listTwo = ["Pat", "mat", "sat", "rat", "cat", "Tat", "Pat"];

var res = listOne.map(function(word) {
  return listTwo.reduce(function(count, test) {
    return word === test ? ++count : count;
  }, 0);
});


document.getElementById('pre').innerHTML =JSON.stringify(res)
console.log(res)//[2,1,0,1,0,1]
<pre id="pre"></pre>

答案 3 :(得分:0)

您可以为第一个列表创建一个循环,并将第二个列表的所有元素与第一个列表中的每个元素进行比较,以查看它们是否存在,如果存在,重复的次数。

var listOne = ["Pat", "cat", "hat", "Tat", "bat", "rat"];
var listTwo = ["Pat", "mat", "sat", "rat", "cat", "Tat", "Pat"];    

function findFreq(listOne, listTwo) {
    var a = [], b = [], flag = false, cache = 0;
    for(var i=0; i<listOne.length; i++){
        var temp = listOne[i];
        for(var j=0; j<listTwo.length; j++){
            if(temp === listTwo[j]){
                cache++;
            }
        }
        if(cache!=0){
            a.push(temp);
            b.push(cache);
            cache=0;
        }
    }
    return [a,b];          
}
var result = findFreq(listOne, listTwo);
    for(var k=0; k<result[0].length; k++){
    console.log(result[0][k] + ': ' + result[1][k]);
}

答案 4 :(得分:0)

进一步查看文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

function myCounter(listOne, listTwo) {
    return [listOne, listTwo].reduce(function(a, b) {
      return a.concat(b);
    }, []).reduce( (countWords, word) => {  
        countWords[word] = ++countWords[word] || 0;     
        return countWords;
    }, {}); 
}

var listOne = ["Pat", "cat", "hat", "Tat", "bat", "rat"];
var listTwo = ["Pat", "mat", "sat", "rat", "cat", "Tat", "Pat"];

console.log(myCounter(listOne, listTwo));

也许它可以帮到你!