JavaScript-如何使用reduce将名称列表映射到指定的键

JavaScript-如何使用reduce将名称列表映射到指定的键,javascript,ecmascript-6,Javascript,Ecmascript 6,我想学习javascript的reduce函数。我使用不同的解决方案实现了以下内容,但希望通过reduce实现同样的效果 我有一个字母表数组和名称数组 alphabets: ['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; 使用javascript reduce函数,我想映射键值对,比如 A: 'Apple','A

我想学习javascript的reduce函数。我使用不同的解决方案实现了以下内容,但希望通过reduce实现同样的效果

我有一个字母表数组和名称数组

alphabets: ['A','B','C','D','E','F','G','H','I','J','K','L',
        'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
使用javascript reduce函数,我想映射键值对,比如

A: 'Apple','Apricot','Avocados','Almond'
B: 'Blueberries', 'Bing Cherry', 'Breadfruit', 'Bananas'
C: 'Cherries', 'Custard-Apple', 'Carrot', 'Cranberries'
D: 'Dates', 'Dragon Fruit', 'Durian'

键A应该包含一个以A开头的水果列表,键B应该包含一个以B开头的水果列表。请帮我解决这个问题。

您可以尝试使用
reduce
并使用
filter
map
从名称数组中获取值

让字母表=['A','B','C','D','E','F','G','H','I','J','K','L',
‘M’、‘N’、‘O’、‘P’、‘Q’、‘R’、‘S’、‘T’、‘U’、‘V’、‘W’、‘X’、‘Y’、‘Z’;
让names=[{name:'Apple'},{name:'Apricot'},{name:'Avocados'},{name:'Almond'},
{name:'蓝莓'},{name:'冰樱桃'},{name:'面包果'},{name:'香蕉'},
{name:'樱桃'},{name:'奶油冻苹果'},{name:'胡萝卜'},{name:'蔓越莓'},
{姓名:'日期'},{姓名:'龙果'},{姓名:'榴莲'},
{name:'葡萄柚'},{name:'葡萄'},{name:'醋栗'},{name:'番石榴'}];
让结果=字母。减少((acc,字母)=>{
acc[letter]=names.map(x=>x.name).filter(name=>name[0]==letter);
返回acc;
}, {})

控制台日志(结果)您不需要字母表数组,只需根据第一个字母减少:

names.reduce((obj,{name})=>{
常量firstLetter=名称[0];
if(obj中的第一个字母){
obj[firstLetter].push(名称);
}否则{
obj[第一个字母]=[姓名];
}
返回obj;
}, {});
您可以与一些一起使用,以实现所需的分组

const name=[{name:'Apple'},{name:'Apricot'},{name:'Avocados'},{name:'Almond'},
{name:'蓝莓'},{name:'冰樱桃'},{name:'面包果'},{name:'香蕉'},
{name:'樱桃'},{name:'奶油冻苹果'},{name:'胡萝卜'},{name:'蔓越莓'},
{姓名:'日期'},{姓名:'龙果'},{姓名:'榴莲'},
{name:'葡萄柚'},{name:'葡萄'},{name:'醋栗'},{name:'番石榴'}];
const grouping=names.reduce((acc,{name})=>{
//将名称分解为iterable,并仅使用第一个字符
让[firstChar]=名称;
firstChar=firstChar.toUpperCase();
acc[firstChar]=(acc[firstChar]| |[])。concat(名称);
返回acc;
},Object.create(null));

console.log(分组)您可以使用名称的第一个字母作为值键

constgroupednames=names.reduce((acc,item)=>{
常量firstLetter=item.name.charAt(0);
如果(!acc[第一个字母]){
acc[第一个字母]=[项目名称];
返回acc;
};
acc[firstLetter].push(item.name);
返回acc;
}, {})

您还可以使用map和filter来完成此操作,因为您需要整个字母表数组,这是解决问题的另一种方法

const name=[{name:'Apple'},{name:'Apricot'},{name:'Avocados'},{name:'Almond'},
{name:'蓝莓'},{name:'冰樱桃'},{name:'面包果'},{name:'香蕉'},
{name:'樱桃'},{name:'奶油冻苹果'},{name:'胡萝卜'},{name:'蔓越莓'},
{姓名:'日期'},{姓名:'龙果'},{姓名:'榴莲'},
{name:'葡萄柚'},{name:'葡萄'},{name:'醋栗'},{name:'番石榴'}]
常量字母=['A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'、'I'、'J'、'K'、'L',
“M”,“N”,“O”,“P”,“Q”,“R”,“S”,“T”,“U”,“V”,“W”,“X”,“Y”,“Z”
];
常量x=字母表.map(x=>({
[x] :[…name.filter(name=>name.name.startsWith(x)).map(m=>m.name)]
}));

控制台日志(x)
您可以获取第一个字符,并将其用作
数组#reduce
的对象累加器中的键

如果存在键,则在相应数组中添加以键开头的单词:

const字母表=['A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'、'I'、'J'、'K'、'L'、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、'U'、'V'、'W'、'X'、'Y'、'Z'];
const names=[{name:'Apple'},{name:'Apricot'},{name:'Avocados'},{name:'Almond'},
{name:'蓝莓'},{name:'冰樱桃'},{name:'面包果'},{name:'香蕉'},
{name:'樱桃'},{name:'奶油冻苹果'},{name:'胡萝卜'},{name:'蔓越莓'},
{姓名:'日期'},{姓名:'龙果'},{姓名:'榴莲'},
{name:'葡萄柚'},{name:'葡萄'},{name:'醋栗'},{name:'番石榴'}];
const grouped=names.reduce((r,{name})=>{
const key=name&&name[0]。toUpperCase();
r[键]=r[键]| |[];
r[key].push(名称);
返回r;
}, {});
控制台日志(分组)您可以使用运算符将数组分配给cetrain属性,并推送实际的析构图名称

const
名称=[{name:'苹果'},{name:'杏子'},{name:'鳄梨'},{name:'杏仁'},{name:'蓝莓'},{name:'冰樱桃'},{name:'面包果'},{name:'香蕉'},{name:'樱桃'},{name:'奶油苹果'},{name:'胡萝卜'},{name:'蔓越莓'},{name:'枣'},{name:'龙胆果'},{name:'榴莲'},{name:'葡萄柚'},{name:'葡萄'},{name:'醋栗'},{name:'番石榴'},
grouped=names.reduce(
(r,{name})=>((r[name[0].toUpperCase()]??=[])。push(name),r),
{}
);
console.log(分组);

.as控制台包装{最大高度:100%!重要;顶部:0;}
欢迎!你绝对确定你需要
字母表吗?-你可以得到每个
名称的第一个字母并使用它-你想要的结果不会包含未使用的字母…注意每个答案是如何将
字母表和
名称之后的
替换为
=
,并结束声明/集合的使用
,并删除
名称的最后一个不需要的
A: 'Apple','Apricot','Avocados','Almond'
B: 'Blueberries', 'Bing Cherry', 'Breadfruit', 'Bananas'
C: 'Cherries', 'Custard-Apple', 'Carrot', 'Cranberries'
D: 'Dates', 'Dragon Fruit', 'Durian'