Javascript 排序对象数组,并在这些对象中添加嵌套数组
更新了示例,因为它与文章中给出的对象结构不匹配 有一个数组,它有多个对象,如下所示:Javascript 排序对象数组,并在这些对象中添加嵌套数组,javascript,arrays,sorting,Javascript,Arrays,Sorting,更新了示例,因为它与文章中给出的对象结构不匹配 有一个数组,它有多个对象,如下所示: { text: text, elements: [ { id: id, page: pageNumber } ] } array.sort(function(a,b) { if (a.text < b.text) return -1; if (a.text > b.tex
{
text: text,
elements: [
{
id: id,
page: pageNumber
}
]
}
array.sort(function(a,b) {
if (a.text < b.text) return -1;
if (a.text > b.text) return 1;
return 0;
});
现在,我需要以两种方式对内容进行排序:
文本
-字段对所有数组元素进行排序{
text: text,
elements: [
{
id: id,
page: pageNumber
}
]
}
array.sort(function(a,b) {
if (a.text < b.text) return -1;
if (a.text > b.text) return 1;
return 0;
});
应分类为:
[
{
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之前,而(现在)第二个对象中页面元素的顺序则相反。对于第一部分,您可以使用。并为页面数组使用另一个拆分字符串的排序函数
var数组=[{id:1,text:'Some text',元素:[{id:1,pages:'45-67'},{id:2,pages:'12-34'},{id:4,pages:'12-5'},{id:5,pages:'12'},{id:3,text:'other text',elements:[{id:3,pages 12-34'}];
array.sort(函数(a,b){
返回a.text.localeCompare(b.text);
});
array.forEach(函数(el){
el.元素.排序(函数(a,b){
var aa=a.pages.split('-'),
bb=b.pages.split('-');
返回aa[0]-bb[0]| |(aa[1]| | 0)-(bb[1]| | 0);
});
});
console.log(数组)代码>有一种对元素进行排序的方法
function transElement () {
return parseInt(s.split('-')[0], 10);
}
elements.sort(function (a, b) {
return transElement(b) - transElement(a);
});
这个问题并不难,因为作者已经把问题分解成了更小的部分。例如,您提到先对文本进行排序,然后对嵌套属性(pages)进行排序,这是您遇到的问题
您的用例更简单,因为我们知道您正在处理页面,所以页码将保持一致。例如,不太可能有像“10-20”和“10-15”这样的条目,如果他们有,那么我下面的代码将不得不扩展一点来处理这种情况
否则,我下面所做的就是使用-
字符作为delimeter拆分字符串条目,以获得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"
]
}
]
哦,我犯了个大错。我的示例结构与本文开头所示的不同。对此我很抱歉。”“元素”应该按“页面”排序,而元素是数组,页面只是一个对象字符串。我真的很抱歉。我更新了帖子。请看这个例子。“localCompare”而不是像Samuel在他的回答中那样使用“sort”有什么好处?如果先按嵌套元素排序,然后再按文本排序,会怎么样?这样你就可以按你想要的方式进行分类(尽管不是很有效)@user3142695我快速浏览了更新后的帖子,不幸的是,我再也无法通过手机访问我的公司了。我的示例代码应该仍然有效。祝你好运,让我知道你的进展如何,我会尽力帮助你。