如何对包含数字和字符串的对象进行排序?

时间:2019-11-26 11:45:29

标签: javascript node.js sorting object lodash

我有一个看起来像这样的对象(例如):

import styled from 'styled-components';

const LogoDiv = styled.img`
src: url(${(props) => props.bg});
width: 200px;
height: 108px;
position: absolute;
left: 175px;
right: 175px;
bottom: 106px;
z-index: 1;
`;

export default LogoDiv;

排序后我需要的对象是:

const items = [{ name: 'LFB 1Y GF'}, {name: 'LFB 3M GF'}, {name: 'LFB 2Y GF'}, {name: 'LFB 10Y GF'}, {name: 'LFB 5Y GF'}]

我尝试了lodash'_.sortBy()',但输出:

const items = [{ name: 'LFB 3M GF'}, {name: 'LFB 1Y GF'}, {name: 'LFB 2Y GF'}, {name: 'LFB 5Y GF'}, {name: 'LFB 10Y GF'}]

有什么办法可以满足我的分类需求?

编辑:我这样排序:

const items =[{ name: 'LFB 10Y GF'}, {name: 'LFB 1Y GF'}, {name: 'LFB 2Y GF'}, {name: 'LFB 3M GF'}, {name: 'LFB 5Y GF'}]

编辑2:为了更清楚一点,我需要按时间顺序对它进行排序,其中'3M'== 3个月,'1Y'== 1年,等等。我要做的就是'name '-键

编辑3:抱歉,我已经更新了我的代码示例!

3 个答案:

答案 0 :(得分:2)

通过使用具有字符串或类似数据结构的数组,您可以使用数字和单位来获取字符串的一部分,以一天为基础获取值,并以天的增量作为排序回调的结果。

const
    getDays = ([count, unit]) => {
        var times = { D: 1, M: 30, Y: 365 };
        return count * times[unit];
    },
    getPart = s => s.match(/(\d+)([DMY])(?=\s)/).slice(1),
    items = ['LFB 5Y GF', 'LFB 3M GF', 'LFB 2Y GF', 'LFB 10Y GF', 'LFB 3Y GF'];

items.sort((a, b) => getDays(getPart(a)) - getDays(getPart(b)));

console.log(items);

答案 1 :(得分:1)

使用localeCompare()replace()

Regex Demo

const items = [{name:'LFB 10Y GF'},{name:'LFB 1Y GF'},{name:'LFB 2Y GF'},{name:'LFB 3M GF'},{name:'LFB 5Y GF'}]

const result = items.sort((a, b) => {
  a = a.name.replace(/(\d+)(.)/, '$2$1')
  b = b.name.replace(/(\d+)(.)/, '$2$1')
  
  return a.localeCompare(b, 'en', {numeric: true})
});

console.log(result);

答案 2 :(得分:-1)

您必须选择正确的数据结构。否则,您将无法对单个值进行排序。

const items = { name: 'LFB 10Y GF', name: 'LFB 1Y GF', name: 'LFB 2Y GF', name: 'LFB 3M GF', name: 'LFB 5Y GF'}

表示const items = { name: "LFB 5Y GF" }