【问题标题】:Sorting an array of objects in javascript by key value does not work [closed]按键值对javascript中的对象数组进行排序不起作用[关闭]
【发布时间】:2017-08-23 17:53:10
【问题描述】:

我正在尝试在 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 

【问题讨论】:

  • 嗯,应该是 1 而不是 0 如果更大的话......

标签: javascript arrays json sorting


【解决方案1】:

应该是comparison = 1;wnennameA &gt; 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());
}

【讨论】:

  • 像魅力一样工作。谢谢!非常好的短代码,我喜欢它。
  • 很高兴它有帮助!
【解决方案2】:

您的比较不准确。

这个:

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

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多