按键值对javascript中的对象数组进行排序不起作用

时间:2017-08-23 17:53:10

标签: javascript arrays json sorting

我正在尝试在javascript中对表示设备接口的对象进行排序和排列。我在这里找到了一些似乎适用于某些情况的代码而不适用于其他情况。

所以这是我的代码:

compareByName = function(a, b) {
    console.log("sort by name");
    const nameA = a.name.toUpperCase();
    const nameB = b.name.toUpperCase();

    let comparison = 0;
    if (nameA > nameB) {
        comparison = 0;
    } else if (nameA < nameB) {
        comparison = -1;
    }
    return comparison;
}

vm.interfaceData.sort(compareByName);

当我有这样的对象时它会起作用:

[
 {
   "name": "eth4",
 },
 {
   "name": "eth3",
 },
 {
   "name": "eth2",
 },
 {
   "name": "eth2",
 }
]

eth0
eth1
eth2
eth3

但是当我有这样的名字时,它似乎不再起作用了:

[
  {
   "name": "GigabitEthernet0/8",
  },
  {
   "name": "SBB",
  },
  {
   "name": "SR-2",
  },
  {
   "name": "GigabitEthernet0/7",
  },
  {
   "name": "SR-1",
  },
  {
   "name": "GigabitEthernet0/5",
  },
  {
   "name": "GigabitEthernet0/4",
  }
]

GigabitEthernet0/8          
SBB         
SR-2        
GigabitEthernet0/7          
SR-1        
GigabitEthernet0/5          
GigabitEthernet0/4 

2 个答案:

答案 0 :(得分:2)

应该是comparison = 1; wnen nameA > nameB

或者更好,请使用.localeCompare()

return nameA.localeCompare(nameB);

const vm = {
  interfaceData: [{
      "name": "GigabitEthernet0/8",
    },
    {
      "name": "SBB",
    },
    {
      "name": "SR-2",
    },
    {
      "name": "GigabitEthernet0/7",
    },
    {
      "name": "SR-1",
    },
    {
      "name": "GigabitEthernet0/5",
    },
    {
      "name": "GigabitEthernet0/4",
    }
  ]
};

console.log(vm.interfaceData.sort(compareByName));

function compareByName(a, b) {
  return a.name.toUpperCase().localeCompare(b.name.toUpperCase());
}

答案 1 :(得分:0)

您的比较不准确。

这:

if (nameA > nameB) {
    comparison = 0;
}

应该是

if (nameA > nameB) {
    comparison = 1;
}

您也可以使用String.localCompare()功能:

const nameA = a.name.toUpperCase();
const nameB = b.name.toUpperCase();
return a.localeCompare(b);