我有两个数组:
alphabet
由字母(例如英语字母表)组成。dictionary
是具有单词和定义的对象列表,'word'
是单词值的关键字。
我想构建一个名为frequency
的新数组,它将包含以字母表数组中每个字母开头的单词数,索引与字母表数组相对应。
我设法想出了以下办法:
alphabet.forEach(function(letter) {
frequency = dictionary.filter(item => item['word'].toLowerCase().startsWith(letter)).length;
});
这为我获取了frequency
的各个值。在Javascript中,构建这些值的数组的最佳语法是什么?这是另一个过滤器吗?或者代码应该手动使用当前的forEach
和增量索引吗?
首先,让我们获取一些示例数据。我们将忽略任何与问题无关的内容。
const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('')
var dictionary = [{'word': 'alpha'}, {'word': 'beta'}, {'word': 'balloon'}]
然后,我们将创建一个results
变量,它将按字母顺序保存所有结果的数组。
var results = []
现在,我们以与您以前相同的方式循环,但我们将把每个结果push
添加到我们的列表中。
alphabet.forEach(function(letter) {
frequency = dictionary.filter(item => item['word'].toLowerCase().startsWith(letter)).length;
results.push(frequency);
});
作为一种让我们更容易查看结果的替代解决方案,我们将把结果作为一个对象,并使用字母作为键。
var results = {};
alphabet.forEach(function(letter) {
frequency = dictionary.filter(item => item['word'].toLowerCase().startsWith(letter)).length;
results[letter] = frequency;
});
使用reduce,您可以轻松地创建一个以字母为键、以匹配数组为值的新对象。
const words = ["abba", "ant", "apple", "bannana", "barn", "car", "cat"];
const alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
const result = alphabet.reduce((a, letter) => {
a[letter] = words.filter(word => word.toLowerCase().startsWith(letter));
return a;
}, {});
console.log(result);