【问题标题】:sortby using Underscore使用下划线排序
【发布时间】:2020-10-07 07:23:13
【问题描述】:

我正在尝试使用下划线 _.sortby() 函数对某些记录进行排序。我的要求是对以 _ 开头的名称给予更高的优先级。例如。如果我的代码是

var patients = [
    [{name: 'John', roomNumber: 1, bedNumber: 1}],
    [{name: 'Lisa', roomNumber: 1, bedNumber: 2}],
    [{name: '_A', roomNumber: 2, bedNumber: 1}],
    [{name: 'Omar', roomNumber: 3, bedNumber: 1}]
];
var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].name;
});

我希望记录 _A, roomNumber: 2, bedNumber: 1 位于顶部。从某种意义上说,我希望排序忽略以 _

开头的字符串

【问题讨论】:

  • 你的问题不清楚,一旦你说优先_然后你说忽略_

标签: javascript underscore.js


【解决方案1】:

String#localeCompare_ 排序到顶部(无论如何)。

var patients = [[{ name: 'John', roomNumber: 1, bedNumber: 1 }], [{ name: 'Lisa', roomNumber: 1, bedNumber: 2 }], [{ name: 'a', roomNumber: 2, bedNumber: 1 }], [{ name: 'A', roomNumber: 2, bedNumber: 1 }], [{ name: '_A', roomNumber: 2, bedNumber: 1 }], [{ name: 'Omar', roomNumber: 3, bedNumber: 1 }], [{ name: '_Omar', roomNumber: 3, bedNumber: 1 }]],
sortedArray = patients.sort( function (a,b) {
    return a[0].name.localeCompare(b[0].name);
});

document.write('<pre>' + JSON.stringify(sortedArray, 0, 4) + '</pre>');

【讨论】:

  • sortby using Underscore 是问题
  • @Reddy 是的,你是对的。我应该删除我的答案吗?
  • :) naaaa 我想在下划线排序的东西中看到你的逻辑..没有别的伙伴..没有冒犯
  • @Reddy,没关系。我不知道下划线。就是这样。
  • 虽然这不是 underscorejs,但我认为这确实是更好的解决方案
【解决方案2】:

试试这个代码。

var patients = [
    [{name: '_John', roomNumber: 1, bedNumber: 1}],
    [{name: 'Lisa', roomNumber: 1, bedNumber: 2}],
    [{name: '_A', roomNumber: 2, bedNumber: 1}],
    [{name: 'Amar', roomNumber: 3, bedNumber: 1}]
];

var sortedByChar = _.sortBy(patients, function(patient) {
  
  return (patient[0].name.indexOf('_') != 0) ? patient[0].name[0] : patient[0].name[1];
  
});

var finalArray = _.sortBy(sortedByChar, function(patient) {
  return (patient[0].name.indexOf('_') != 0); 
});

alert(JSON.stringify(finalArray));
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"&gt;&lt;/script&gt;

您可以通过在其他名称中添加下划线来玩弄小提琴,看看它是如何排序的。

【讨论】:

  • 如果您在记录集中添加 A,我将 A 作为最后一条记录。理想情况下,我会在 _A 之后需要 A
  • 很抱歉造成混乱。实际上我们可以修改逻辑以检查名称是否以_开头
  • 我们在逻辑中检查它对吗?? indexOf('_')
【解决方案3】:

你可以的

var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].name.replace('_', '0');
});

见小提琴https://jsfiddle.net/s7r2kxhq/3/

【讨论】:

    【解决方案4】:

    您可以通过将字符串转换为小写来实现:

    var patients = [ [{name: 'John', roomNumber: 1, bedNumber: 1}], [{name: 'Lisa', roomNumber: 1, bedNumber: 2}], [{name: '_A', roomNumber: 2, bedNumber: 1}], [{name: 'Omar', roomNumber: 3, bedNumber: 1}] ];
    
    var sortedArray = _.sortBy(patients, function(patient) {
        return patient[0].name.toLowerCase();
    });
    
    document.write(JSON.stringify(sortedArray));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案5】:

      这样做的一种可能性是将 _.sortBy 中的迭代更新为以下内容

      function(value){
          if(value[name].substr(1) != '_') {
              return "z" + value[name];   
          } 
          return value[name];
      }
      

      此函数将在开头附加一个代码值高于_的字符,这意味着其他所有内容都将在带有_的值之后排序

      【讨论】:

        【解决方案6】:

        使用Array.prototype.sort 并测试名称是否有“_”

        var sortedArray = patients.sort(function(a, b) {
            if (/^_/.test(a[0].name)) {
                return -1;
            }
            return a[0].name < b[0].name ? -1 : 1;
        });
        

        而且你的js对象有点奇怪,为什么你的对象周围有一个数组?

        【讨论】:

        • 请在 Stack Overflow 上使用适合工作场所的语言,而不是可能会冒犯某些人群的语言。请参阅:Are expletives (cursing, swear words, vulgar language) allowed on SE sites? 请记住,使用攻击性语言往往会导致人们对您的帖子反应不佳(即他们可能会投反对票)。此外,您真的希望未来的雇主看到您在本应是专业的情况下使用这种语言吗?
        • 我现在已经从你的答案中编辑了坏词。
        猜你喜欢
        • 2013-09-23
        • 2023-04-04
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 2018-01-04
        • 1970-01-01
        相关资源
        最近更新 更多