如何在另一个多维数组中从对象属性创建所有首字母的数组?

时间:2015-11-05 14:40:53

标签: javascript arrays object filter

我有一个包含对象的数组,每个对象都包含一个名为name的属性。

现在我想要第二个数组,其中包含第一个数组中每个name属性的第一个字母。如果尚未存在,则第一个字母应保存在名为header的属性中。

我只希望有一个字母出现一次,因为此脚本旨在用于字母标题列表,每个字母标题包含以相同字母开头的名称列表。

我创建了一个使用内置JavaScript"过滤器"方法,用于检查是否已存在具有该第一个字母的值。但由于某种原因,它不起作用。无论我提供什么字母,过滤器总是返回一个空数组。

我一直试图弄清楚为什么我的脚本没有成功。非常感谢任何帮助!

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);

2 个答案:

答案 0 :(得分:5)

首先使用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;
});

答案 1 :(得分:1)

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"}]);