Javascript 向数组中添加字母排序字符

Javascript 向数组中添加字母排序字符,javascript,knockout.js,Javascript,Knockout.js,基本上,我已经整理了一系列客户名称: Al K. Seltzer Alf A. Romeo Ali Gaither, Ali Katt Amber Green Cam Payne Cara Van Craven Moorehead Crystal Ball Crystal Claire Waters Ford Parker Forrest Green Foster Child 我想添加排序字符: **A** Al K. Seltzer Alf A. Romeo Ali Gaither, Ali

基本上,我已经整理了一系列客户名称:

Al K. Seltzer
Alf A. Romeo
Ali Gaither, Ali Katt
Amber Green
Cam Payne
Cara Van
Craven Moorehead
Crystal Ball
Crystal Claire Waters
Ford Parker
Forrest Green
Foster Child
我想添加排序字符:

**A**
Al K. Seltzer
Alf A. Romeo
Ali Gaither, Ali Katt
Amber Green
**C**
Cam Payne
Cara Van
Craven Moorehead
Crystal Ball
Crystal Claire Waters
**F**
Ford Parker
Forrest Green
Foster Child
我目前的做法是:

function addSortigChars(elements) {
  var lastChar=elements[0].LastName.substring(0,1).toUpperCase();
  var newArray=[];
  newArray.push(lastChar);
  for(var i=0;i<elements.length;i++) {
      var newChar=elements[i].LastName.substring(0,1).toUpperCase();
      if(newChar!=lastChar) {
         lastChar=newChar;
         newArray.push(lastChar);
      }
      newArray.push(elements[i]);
  }
  return(newArray);
 }
函数addSortigChars(元素){
var lastChar=elements[0].LastName.substring(0,1).toUpperCase();
var newArray=[];
newArray.push(lastChar);

对于(var i=0;i您是对的,删除每个元素不是最有效的解决方案,但我认为优化它所带来的性能好处不值得增加复杂性

但是,如果你真的想优化它,你可以!你可以先为每个字母设置一个条目数量的估计值,例如,如果你有1000个元素,你可以估计以A开头的名称大约是100个。 然后,你可以使用二进制搜索的一个版本来查找从B开始的第一个名字,在0, 200的范围内。记住,200是一个软限制,如果你的估计很差,所有的名字在100和200之间从A开始,你需要考虑通过它。事实上,我会用最大值作为(估计+最大已知A)。并在发现更大的a时进行更新。 一旦找到第一个B===必须插入B的位置,然后继续下一个字母

通过使用(修改过的)二进制搜索,可以保证跳过大多数元素。效率部分取决于估计的准确性

祝实施顺利


原始算法的一种更清晰的实现,可在适当位置更改阵列:

function addSortingChars(elements) {
  var last = '';
  for (var i=0; i<elements.length; i++) {
    if (elements[i][0].toUpperCase() !== last) {
      last = elements[i][0].toUpperCase();
      elements.splice(i, 0, last);
    }
  }
}
函数添加排序字符(元素){
var last='';

对于(var i=0;i,可以向后迭代数组

如果您记录您的
arr

["***A***", "Al K. Seltzer", "Alf A. Romeo", "Ali Gaither, Ali Katt", "Amber Green", "***C***", "Cam Payne", "Cara Van", "Craven Moorehead", "Crystal Ball", "Crystal Claire Waters", "***F***", "Ford Parker", "Forrest Green", "Foster Child"]
["***A***", "Al K. Seltzer", "Alf A. Romeo", "Ali Gaither, Ali Katt", "Amber Green", "***C***", "Cam Payne", "Cara Van", "Craven Moorehead", "Crystal Ball", "Crystal Claire Waters", "***F***", "Ford Parker", "Forrest Green", "Foster Child"]