簡體   English   中英

從聯系人創建按字母順序分組的列表

[英]Creating alphabetic grouped list from contacts

我有一個需要兩個數組的函數。 第一個數組稱為字母,包括聯系人數組中的所有(唯一)起始字母。 第二個參數采用上述的Contacts數組。

該函數應根據所有聯系人的起始字母對它們進行分組,並為每個字母以及包含聯系人的對象創建一個新數組。 該對象應如下所示:

{
"letter": "S", 
"names": [Sample1, Sample2, Sample3] 
}

該功能已經可以使用,但是有問題。 如果有多個具有相同起始字母的聯系人,則數組將被最后一個聯系人覆蓋,因此名稱的最大值始終為1。這是我使用所有對象創建數組的功能:

function groupContacts(letters, contacts) {
  var groupedContacts = [];
  for (var i = 0; i < contacts.length; i++) {
    for (var j = 0; j < letters.length; j++) {
      if (
        letters[j].toLowerCase() === contacts[i].toLowerCase().substring(0, 1)
      ) {
        let names = []
        names.push(contacts[i])
        groupedContacts[j] = {
          letter: letters[j],
          name: names
        };
      }
    }
  }
  console.log(groupedContacts, "grouped Contacts");
}

謝謝你的幫助!

PS:這是jsfiddle https://jsfiddle.net/bn7f8tsx

您可以嘗試創建letters: names映射letters: names ,然后在該映射的鍵上循環並創建您的結構。

 let contacts = ["Simon", "Mike", "Jake", "Lara", "Susi", "Blake", "James"]; var map = contacts.reduce((p, c) => { let char = c.charAt(0).toUpperCase(); p[char] = [].concat((p[char] || []), c) return p; }, {}); var result = Object.keys(map).map(k => ({ letter: k, names: map[k] })); console.log(result); 

您可以使用哈希表(因此您不需要每次都搜索字母),並且也不需要letter數組:

function groupContacts(contacts) {
  var groupedContacts = [],hash={};
  contacts.forEach(function(contact){    
    var letter = contact.toLowerCase().substring(0, 1)
    if(hash[letter]){
     hash[letter].names.push(contact);
    }else{       
     groupedContacts.push(hash[letter]= {
      letter,
      names: [contact]
    });
   }
});
console.log(groupedContacts, "grouped Contacts");
return groupedContacts;
}

試試吧

或者,您使用舊版本並改進邏輯(稍微慢一點),並且這里也不需要字母:

function groupContacts(contacts) {
 var groupedContacts = [];
 contLoop:for (var i = 0; i < contacts.length; i++) {
   for (var j = 0; j < groupedContacts.length; j++) {
    if (
    groupedContacts[j].letter.toLowerCase() === 
    contacts[i].toLowerCase().substring(0, 1)
    ) {
     groupedContacts[i].names.push(contacts[i]);
     continue contLoop;//exit is important
   }
  }
  //no letter found, create new
    groupedContacts[j] = {
      letter: contacts[i].toLowerCase().substring(0, 1),
      names:[contacts[i]]
    };
}
  console.log(groupedContacts, "grouped Contacts");
  return groupedContacts;
}

試試吧

我使用了reduce模式,因為它是為解決這類問題而設計的。

  1. 使用Array.reduce創建了分組列表
  2. Array.sort排序

小提琴

 let contacts = [ "Simon", "Mike", "Jake", "Lara", "Susi", "Blake", "James" ]; var contactsGrouped = contacts.reduce(function(contactList, name) { var contactLetterGroup = contactList.filter(function(list) { return list.letter == name[0].toUpperCase(); }); if (contactLetterGroup.length > 0) { contactLetterGroup[0].name.push(name); } else { contactList.push({ letter: name[0].toUpperCase(), name: [name] }); } return contactList; }, []) .sort(function(a, b) { return b.letter - a.letter; }) console.log(contactsGrouped); 

您可以使用哈希表並收集字母數組。

 function groupNames(array) { var hash = Object.create(null), result = []; array.forEach(function (a) { var k = a[0].toUpperCase(); if (!hash[k]) { hash[k] = []; result.push({ letter: k, names: hash[k] }); } hash[k].push(a); }); return result; } console.log(groupNames(['Anne', 'Bert', 'Claudine', 'Dirk', 'Anton', 'Babette', 'Eugen', 'Felicitas'])); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您需要做的只是將let names = []字符串放在循環之外;

 function groupContacts(letters, contacts) { var groupedContacts = []; let names = [] for (var i = 0; i < contacts.length; i++) { for (var j = 0; j < letters.length; j++) { if ( letters[j].toLowerCase() === contacts[i].toLowerCase().substring(0, 1) ) { names.push(contacts[i]) groupedContacts[j] = { letter: letters[j], name: names }; } } } console.log(groupedContacts, "grouped Contacts"); } groupContacts('S',['Sarah', 'John','Silvester', 'Tracy','Sean']) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM