找到常用词并推入新数组

时间:2019-04-01 11:05:55

标签: javascript

我在下面有Array,并附加了输出。

  

`var   arrayData = ['cat','mat','tac','hiller','mamaer','llerih','eramam'];

     

输出:[[cat,tac],[mat],[hiller,llerih],[mamaer,erama]];`

想要提取数组中的常用字母并存储在新数组中。

我正在尝试使用array.reducer来实现。

2 个答案:

答案 0 :(得分:1)

您可以使用Map和一个简单的循环来完成此操作。想法是您通过根据字符代码和单词长度的总和创建一个“键”来记录每个单词。

使用Array#Reduce对单词字符代码求和。

即:

//sum of each letter's character code using reduce
const res1 = "test".split("").reduce((a,c)=>a+c.charCodeAt(), 0);
const res2 = "ttes".split("").reduce((a,c)=>a+c.charCodeAt(), 0);
const l    = "test".length;


const key1 = `${l}_${res1}`;
const key2 = `${l}_${res2}`;

console.log(key1, key2, key1 === key2); //4_448 4_448 true

即(没有reduce和for循环):

function sum(word){
  let s = 0;
  for(let i = 0; i < word.length; i++){
    s += word[i].charCodeAt();
  }
  return s
}

//sum of each letter's character code using reduce
const res1 = sum("test");
const res2 = sum("ttes");
const l    = "test".length;


const key1 = `${l}_${res1}`;
const key2 = `${l}_${res2}`;

console.log(key1, key2, key1 === key2); //4_448 4_448 true

记录单词的长度会增加安全性,以防两个不同长度的单词的总和相同

完整解决方案:

const data = ['cat','mat','tac','hiller','mamaer','llerih','eramam'];

const m = new Map();

for(let i = 0; i < data.length; i++){
  const word = data[i];
  
  const sum = word.split("").reduce((a,c)=>a+c.charCodeAt(), 0);
  const key = `${word.length}_${sum}`;
  m.set(key, [word].concat(m.get(key)||[]));
}

const res = Array.from(m.values());

console.log(res);

答案 1 :(得分:1)

我用另一种方法解决了问题,对它们进行排序,分组然后按索引显示。

 arr = arr.filter{ !$0.isEmpty }

try it here