Javascript 如何从另一个多维数组中的对象属性创建包含所有首字母的数组?
我有一个包含对象的数组,每个对象都包含一个名为name的属性 现在我想要第二个数组,其中包含第一个数组中每个name属性的第一个字母。如果首字母还不存在,则应将其保存在名为header的属性中 我只想让一个字母出现一次,因为这个脚本用于一个字母标题列表,每个标题都包含一个以相同字母开头的名称列表 我创建了一个使用内置JavaScript“filter”方法的函数,该方法用于检查是否已经存在第一个字母的值。但由于某种原因,它不起作用。无论我提供什么字母,过滤器总是返回一个空数组 我一直在试图弄明白为什么我的脚本没有成功。我非常感谢您的帮助Javascript 如何从另一个多维数组中的对象属性创建包含所有首字母的数组?,javascript,arrays,object,filter,Javascript,Arrays,Object,Filter,我有一个包含对象的数组,每个对象都包含一个名为name的属性 现在我想要第二个数组,其中包含第一个数组中每个name属性的第一个字母。如果首字母还不存在,则应将其保存在名为header的属性中 我只想让一个字母出现一次,因为这个脚本用于一个字母标题列表,每个标题都包含一个以相同字母开头的名称列表 我创建了一个使用内置JavaScript“filter”方法的函数,该方法用于检查是否已经存在第一个字母的值。但由于某种原因,它不起作用。无论我提供什么字母,过滤器总是返回一个空数组 我一直在试图弄明白
var fruit = [{title:"Apple"},{title:"Avocado"},{title:"Banana"},{title:"Cucumber"}];
var sections = [];
function createAlphabetSections(array) {
for(var i = 0; i < array.length; i++){
var firstLetter = array[i].title.charAt(0).toUpperCase();
var section = sections.filter(function (section) { return section.header === firstLetter;});
if(sections.length === 0){
sections.push([{header: firstLetter}]);
} else if (section.length > 0){
sections.push([{header: firstLetter}]);
}
}
}
createAlphabetSections(fruit);
var水果=[{title:“苹果”},{title:“鳄梨”},{title:“香蕉”},{title:“黄瓜”}];
var部分=[];
函数CreateAlphabets分区(数组){
对于(var i=0;i0){
push([{header:firstLetter}]);
}
}
}
创建字母表(水果);
首先使用map从当前数组构建一个新数组。然后过滤掉所有重复项
var sections = fruit.map(function (item) {
// Return the first letter of the title property
return item.title.substring(0, 1);
}).filter(function (value, index, self) {
// http://stackoverflow.com/a/14438954/1789518
return self.indexOf(value) === index;
});
请提供预期函数输出的示例。函数应返回一个对象数组。每个对象都应该有一个名为header的属性,该属性具有分配给它的第一个数组中每个title属性的第一个字母。应该删除重复项:
[Object{headerTitle=“A”},Object{headerTitle=“B”},Object{headerTitle=“C”}]
此解决方案也非常有用。非常感谢!代码运行得很好。我花了一些时间才弄明白这里发生了什么:returnself.indexOf(value)==index我知道self是数组,indexOf将返回给定值第一次出现的键。这意味着我们总是在这里检查该数组中给定值的第一次出现。如果此值的索引与当前索引相同,则进行比较。如果是,则表示该项是唯一的,我们返回true。如果索引不同,则意味着我们发现了重复项并返回false。filter方法只返回返回true的项。在我的例子中,map()应该返回一个对象数组,每个对象都包含一个名为header的属性。也许我弄错了,但在这种情况下,我想我不能在过滤器中使用indexOf(),因为我想比较两个对象属性,而不是两个数组值。有没有一种方法可以使indexOf方法在对象属性上工作,或者我必须使用另一种方法?我找到了一种可以返回所需对象的解决方案。我在脚本末尾添加了另一个映射,将所有字符串值转换为对象:var sections=fruit.map(函数(item){return item.title.substring(0,1);}).filter(函数(value,index,self){return self.indexOf(value)==index;}).map(函数(item){return return headerTitle:item}
var getLetters = function(items) {
var letters = [];
items.forEach(function(item) {
if(letters.indexOf(item.title[0].toUpperCase()) === -1) {
letters.push(item.title[0].toUpperCase());
}
});
return letters;
};
getLetters([{title:"Apple"},{title:"Avocado"},{title:"Banana"},{title:"Cucumber"}]);