gpt4 book ai didi

javascript - 通过分析字符串中的日期详细信息对字符串数组进行排序

转载 作者:行者123 更新时间:2023-12-02 19:12:36 25 4
gpt4 key购买 nike

我对我现在正在从事的项目有一个要求,这对我来说有点棘手。

基本上,我必须根据这些项目的 Text 属性对项目数组进行排序:

这是我的元素:

var answers = [],
answer1 = { Id: 1, Text: '3-4 weeks ago' },
answer2 = { Id: 2, Text: '1-2 weeks ago' },
answer3 = { Id: 3, Text: '7-8 weeks ago' },
answer4 = { Id: 4, Text: '5-6 weeks ago' },
answer5 = { Id: 5, Text: '1-2 days ago' },
answer6 = { Id: 6, Text: 'More than 1 month ago' };

answers.push(answer1);
answers.push(answer2);
answers.push(answer3);
answers.push(answer4);
answers.push(answer5);
answers.push(answer6);

我需要分析每个项目的 Text 属性,以便在排序后,数组看起来像这样:

answers[0] = { Id: 6, Text: 'More than 1 month ago' }
answers[1] = { Id: 3, Text: '7-8 weeks ago' }
answers[2] = { Id: 4, Text: '5-6 weeks ago' }
answers[3] = { Id: 1, Text: '3-4 weeks ago' }
answers[4] = { Id: 2, Text: '1-2 weeks ago' }
answers[5] = { Id: 5, Text: '1-2 days ago' }

逻辑是,日期距离越远,优先级越高,因此它应该出现在数组的第一个位置。因此,“1-2 天”的优先级不如“7-8 周”。

所以逻辑是,我需要提取数值,然后提取单位(例如天、周),并根据这些详细信息以某种方式对数组进行排序。

老实说,我发现很难找到解决方案,如果有任何帮助,我将不胜感激。

编辑:关于我正在使用的数据,它是从网络服务返回的,我无法更改文本。所以我必须按原样使用它。

最佳答案

您可以使用自定义排序函数来解析文本中的值并按照描述进行数字比较 here .

var answers = [
{ Id: 1, Text: '3-4 weeks ago' },
{ Id: 2, Text: '1-2 weeks ago' },
{ Id: 3, Text: '7-8 weeks ago' },
{ Id: 4, Text: '5-6 weeks ago' },
{ Id: 5, Text: '1-2 days ago' },
{ Id: 6, Text: 'More than 1 month ago' }
];

answers.sort(function(a, b) {
function getVal(item) {
var val;
// find first number
var match = item.Text.match(/\d+/);
if (match) {
val = parseInt(match[0], 10);
} else {
val = 10000; // set to very high number
}
if (item.Text.indexOf("More than") !== -1) {
++val;
}
if (item.Text.indexOf("week") !== -1) {
val *= 7;
} else if (item.Text.indexOf("month") !== -1) {
val *= 30;
}
return(val);
}
return(getVal(b) - getVal(a));
});

工作演示:http://jsfiddle.net/jfriend00/cf3D7/

您显然可以微调 getVal() 函数以支持您想要的任何解析逻辑。

如果您的数组很大,您可以通过预先计算排序索引并将其存储在每个对象中来使其性能更好,这样自定义排序函数就直接比较两个数字,而不是每次都重新计算。但是,少于 100 个项目的数组可能无关紧要。

此外,尚不清楚您希望如何对“1 个月以上”和“7-8 周”进行排序。我当前的算法将“超过 1 个月前”视为 1 个月,但如果您有特定的规则,则可以调整解析逻辑。一旦有了自定义排序函数,排序逻辑的关键就在于 getVal() 函数的实现,您可以调整该函数以支持您想要支持的任何语法。

这是一个预先计算 sortKey 的版本,因此对于大型数组来说性能更好:

(function() {
function getVal(item) {
var val;
// find first number
var match = item.Text.match(/\d+/);
if (match) {
val = parseInt(match[0], 10);
} else {
val = 10000; // set to very high number
}
if (item.Text.indexOf("More than") !== -1) {
++val;
}
if (item.Text.indexOf("week") !== -1) {
val *= 7;
} else if (item.Text.indexOf("month") !== -1) {
val *= 30;
}
return(val);
}

for (var i = 0, len = answers.length; i < len; i++) {
answers[i].sortKey = getVal(answers[i]);
}
answers.sort(function(a, b) {
return(b.sortKey - a.sortKey);
});
})()

附注请注意我在 jsFiddle 中使用的更高效的数组声明语法。

关于javascript - 通过分析字符串中的日期详细信息对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com