下划线sortby指定一些项目

时间:2017-10-17 19:02:22

标签: javascript sorting underscore.js

我使用underscore s sortBy()array个字符串进行排序。但是我想比其他人更早地对几个(硬编码的)字符串进行排序 - 我将向用户显示输出,并且将相关字符串放在前面更为自然。

例如:我希望nametype分别出现在第一和第二位,然后按字母顺序排列其他所有内容。

假设:

["above", "name", "below", "foo", "type", "bar"]

我想:

["name", "type", "above", "bar", "below", "foo"]

我知道我可以向iteratee sortBy()提供const relevantSort = function(key) { if (key === 'name') { return [0, key]; } if (key === 'type') { return [1, key]; } return [2, key]; } ,但对我来说有点不清楚如何干净利落地持续获得理想的行为。

我试过了:

[10, key]

(我知道有办法收紧,但这与我的问题正交)。

这导致一个稳定排序的,正确排序的数组...但如果我有一堆硬代码并最终在某处返回name,这会崩溃,因为Javascript数组排序将数字强制转换成字符串。

是否有更清晰,更清洁,更不易碎的方式来达到我想要的行为?

编辑: 此外,可能还没有从上面清楚 - 我事先不知道阵列的内容,我不知道typeindex是否永远在那里(也不是在 public void actionPerformed(ActionEvent arg0) { if(!textField.getText().equals("")) { SwingUtilities.invokeLater(new Runnable() { public void run() { btnSubmit.setText("Working..."); } }); //btnSubmit.setText("Working..."); ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar); SwingUtilities.invokeLater(new Runnable() { public void run() { btnSubmit.setText("Submit"); } }); } else { ft.warningMessage("The ISCII textbox cannot be blank."); } } }); ,如果它们确实存在的话。)

4 个答案:

答案 0 :(得分:1)

怎么样:

<强>已更新

var array = ["above", "name", "below", "foo", "type", "bar"];

if(array.indexOf('type') > -1) {
    array.splice(1, 0, array.splice(array.indexOf('type'), 1)[0]);
}

if(array.indexOf('name') > -1) {
    array.splice(0, 0, array.splice(array.indexOf('name'), 1)[0]);
}

答案 1 :(得分:0)

我不确定如何&#34;强调&#34;完全正常,但这个纯JavaScript代码可能会帮助你。 这也是一种硬编码,但它可能适合你。

var arr = ["above", "name", "below", "foo", "type", "bar"];

['name', 'type'].concat(arr.filter(function(item) {
    return item !== "name" && item !== "type";
}).sort(function(a, b) {
    return a > b;
}));

如果您正在寻找["name", "type", 10, 11, 140, "above", "bar", "below", "foo"]之类的东西,请从排序中删除回调函数,因为它会先给出结果,然后是数字。

答案 2 :(得分:0)

<强>已更新

var array = ["above", "name", "below", "foo", "type", "bar"]; 

var hardcoded_array = ["name", "type"]; 

var difference = _.difference(array, hardcoded_array); 

var value_exist_array = _.intersection(array, hardcoded_array);

var sorted_array = _.sortBy(difference, function(value) {
       return value; 
});

console.log(value_exist_array.concat(sorted_array)); // ["name", "type", "above", "bar", "below", "foo"]

答案 3 :(得分:0)

您可以使用自定义排序功能,其中订单对象指定单词,并使用指定顺序的值。低值的单词将出现在排序数组中具有高值的单词之前。

&#13;
&#13;
const order = {'name' : 1, 'type' : 2};

function sortArray(order, arr) {
  return arr.sort(function(a,b) {
    if(order[a] && order[b])
      return order[a] - order[b];
    else if(order[a] || order[b])
      return order[a] || order[b];
    else
      return a.localeCompare(b);   
  });
}

console.log(sortArray(order, ["above", "name", "below", "foo", "type", "bar"]));
console.log(sortArray(order, ["above", "below", "foo", "type", "bar"]));
console.log(sortArray(order, ["above", "below", "foo", "bar"]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;