如何通过字符串属性对对象数组进行排序

时间:2015-10-15 09:16:16

标签: javascript jquery underscore.js

以此为例:

var data = [
{ name: 'Random 100 Index' },
{ name: 'Random 25 Index' },
{ name: 'Random 75 Index' },
{ name: 'Random 50 Index' } ];

我想基于 name 属性按升序对此数组进行排序。我已经尝试了各种jQuery& amp;技术Underscore.js和我没有得到我想要的东西。问题是 Random 100 Index 将是排序数组中的第一项。 以此功能为例:

function sortByProperty(property) {
'use strict';
return function (a, b) {
    var sortStatus = 0;
    if (a[property] < b[property]) {
        sortStatus = -1;
    } else if (a[property] > b[property]) {
        sortStatus = 1;
    } 
    return sortStatus;
}; }

当我var result = data.sort(sortByProperty('name'));时,结果如下:

[{ name: 'Random 100 Index' }, { name: 'Random 25 Index }, { name: 'Random 50 Index' }, { name: 'Random 75 Index' } ]

项目已正确排序,但 Random 100 Index 应该是最后一项。

我该如何解决这个问题?你如何对这样的字符串数组进行排序?

3 个答案:

答案 0 :(得分:4)

您可以使用 sort() match() 。使用 match() 从字符串中查找整数值,根据 sort() 的帮助对数组进行排序。

var data = [{
  name: 'Random 100 Index'
}, {
  name: 'Random 25 Index'
}, {
  name: 'Random 75 Index'
}, {
  name: 'Random 50 Index'
}];


var res = data.sort(function(a, b) {
  return a.name.match(/\d+/)[0] - b.name.match(/\d+/)[0];
});

document.write('<pre>' + JSON.stringify(res,null,2) + '</pre>');

UPDATE:它只会根据字符串中第一次出现的数字进行排序。

答案 1 :(得分:1)

临时存储索引和大数据集值的结果。

&#13;
&#13;
var data = [
        { name: 'Random 100 Index' },
        { name: 'Random 25 Index' },
        { name: 'Random 75 Index' },
        { name: 'Random 50 Index' }
    ],
    result = data.map(function (el, i) {
        return {
            index: i,
            value: /\d+/.exec(el.name)[0]
        };
    }).sort(function (a, b) {
        return a.value - b.value;
    }).map(function (el) {
        return data[el.index];
    });

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

感谢 Pranav C Balan Nina Scholz ,我提出了以下解决方案。

按字母顺序排序数组:

&#13;
&#13;
function sortByProperty(property) {
    'use strict';
    return function (a, b) {
        var sortStatus = 0;
        if (a[property] < b[property]) {
            sortStatus = -1;
        } else if (a[property] > b[property]) {
            sortStatus = 1;
        }
 
        return sortStatus;
    };
}

var result = data.sort(sortByProperty('name'));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

根据属性文本中的第一个数字对数组进行排序:

&#13;
&#13;
var res2 = res1.sort(function(a, b) {
    return a.name.match(/\d+/)[0] - b.name.match(/\d+/)[0];
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

非常简单。 谢谢大家:))