更新了示例,因为它与帖子中提供的对象结构不匹配
有一个数组,它有多个这样的对象:
{
text: text,
elements: [
{
id: id,
page: pageNumber
}
]
}
现在我需要以两种方式对内容进行排序:
text
- 字段我会这样做:
array.sort(function(a,b) {
if (a.text < b.text) return -1;
if (a.text > b.text) return 1;
return 0;
});
elements
- 数组的内容也应按page
- 字段排序。我不知道如何对一个嵌套在对象中的数组进行排序......不幸的是,由于元素是字符串,它会变得更加困难,但代表了一些页码。那么如何以正确的方式对这些数据进行排序,因为元素看起来像123
或23-34
?在123-125
,23-34
的情况下,最后一个元素应该是第一个元素。
示例
[
{
text: 'Some text',
elements: [
{ id: 1, pages: '45-67' },
{ id: 2, pages: '12-34' }
]
},
{
text: 'Another text',
elements: [
{ id: 3, pages: '12-34' }
]
}
]
应排序为:
[
{
text: 'Another text',
elements: [
{ id: 3, pages: '12-34' }
]
},
{
text: 'Some text',
elements: [
{ id: 2, pages: '12-34' },
{ id: 1, pages: '45-67' }
]
},
]
所以对象顺序已经改变,因为 A 在 S 之前,并且(现在)第二个对象中的页面元素的顺序是相反的。
答案 0 :(得分:3)
答案 1 :(得分:1)
问题并不困难,因为作者已经将问题分解为更小的问题。例如 - 你提到先对文本进行排序,然后再对你遇到问题的嵌套属性(页面)进行排序。
您的用例更容易,因为我们知道您正在处理页面,因此页码将保持一致。例如。它不太可能有像'10 -20'和'10 -15'这样的条目,如果他们这样做,那么我的代码将不得不扩展一点来处理这种情况。
否则我在下面所做的就是使用-
字符作为分隔符来拆分字符串条目,以获得fromPage
和toPage
参数。然后使用fromPage,我们在sort
函数中进行常规比较,以确定谁更小。
一旦对它进行了排序,然后我对你已经得到解决方案的外部项进行排序。
<强>解决方案:强>
// Sort the nested properties first - in this instance it will be page
example.forEach(item => {
item.pages.sort(function (a, b) {
aFromPage = a.split('-')[0];
bFromPage = b.split('-')[0];
// Assuming from page number is unique, if it is not unique then the ToPage number can be
// used for comparison also.
return (aFromPage < bFromPage) ? -1 : 1;
})
});
// Handle the outer item
example.sort(function(a,b) {
if (a.text < b.text) return -1;
if (a.text > b.text) return 1;
return 0;
});
console.log(JSON.stringify(example));
<强>输出:强>
[
{
"id" : 3,
"text" : "Another text",
"pages":
[
"1-11",
"12-34",
"35-100"
]
},
{
"id" : 1,
"text" : "Some text",
"pages":
[
"12-34",
"35-44",
"45-67",
"68-100"
]
}
]
答案 2 :(得分:0)
有一种方法可以对元素进行排序。
function transElement () {
return parseInt(s.split('-')[0], 10);
}
elements.sort(function (a, b) {
return transElement(b) - transElement(a);
});