在javascript中对具有偏移量的对象数组进行排序

Posted

技术标签:

【中文标题】在javascript中对具有偏移量的对象数组进行排序【英文标题】:Sort array of objects having the offsets in javascript 【发布时间】:2018-10-10 14:45:31 【问题描述】:

我是web development 的新手。在这里,我确实有一个类似于

的数组
[
        endOffset: "50"
        startOffset: "25"
        type: "Education"
    ,
    
        endOffset: "67"
        startOffset: "55"
        type: "address"
    ,
    
        endOffset: "65"
        startOffset: "59"
        type: "project"
    ,
    
        endOffset: "80"
        startOffset: "70"
        type:"fullname"
    ]

在这个对象数组中,现在我根据 endoffsets 对其进行排序。就像 ->

jsonDataArray.sort(function (a, b) 
            return a.startOffset - b.startOffset;
          );

然后它给了我排序的数组。但这里仅根据startoffset 进行排序。

我想要的是我想要一个像这样的数组,它将按 start 和 endoffset 的升序排序,这样数组就会像

[
 starOffset: "25",
 type: "Education"
, 
 endOffset: "50"
 type: "Education" ,


 startoffset: "55"
 type: "address" ,

 startoffset: "59"
 type: "project" ,

 endoffset: "65"
 type: "project" ,


 endoffset: "67"
 type: "address" 
,

 endoffset: "67"
 type: "address" 
,

 startOffset: "70"
 type: "address" 
,

 endoffset: "80"
 type: "address" 
,

]

那么,我该怎么做呢?有人可以帮我解决这个问题吗?

【问题讨论】:

你可以查看这个话题:“How to sort an array of objects by multiple fields?”,好像和你的问题有关。 为了让您免于未来的头痛/问题:您的代码中不涉及 JSON - jsonDataArray 是一个对象数组,与 JSON 没有任何关系。 好的,谢谢。为此。 那么如果 startOffset 相同,你想按 endOffset 排序吗? 所以,在这种情况下,首先出现的将首先添加到数组中 【参考方案1】:

首先使用 startOffsetendOffset 在单独的对象中创建所需的数组,然后您可以通过在您的 sort 函数中设置条件来分配 aValbVal 的值,如下面的代码中所述:

var jsonDataArray = [
        endOffset: "50",
        startOffset: "25",
        type: "Education"
    ,
    
        endOffset: "67",
        startOffset: "65",
        type: "address"
    ,
    
        endOffset: "65",
        startOffset: "59",
        type: "project"
    ,
    
        endOffset: "80",
        startOffset: "70",
        type:"fullname"
    ];

var newJSON = [];
jsonDataArray.forEach((obj)=>
  var  tempObj = 
     endOffset: obj.endOffset,
     type: obj.type
  ;
  newJSON.push(tempObj);
  tempObj = 
     startOffset: obj.startOffset,
     type: obj.type
  ;
  newJSON.push(tempObj);
);
newJSON.sort(function (a, b) 
  var aVal = a.startOffset?a.startOffset:a.endOffset;
  var bVal = b.startOffset?b.startOffset:b.endOffset;
  return aVal - bVal;
);
console.log(newJSON);

【讨论】:

这里第一个是我的 jsonData 数组。下一个是我预期的输出。 嘿,如果偏移量相同会发生什么? 它们仍然可以工作,因为如果发现对象中存在startOffset,它将使用该条件,否则它将使用endOffset,并且代码肯定会有@987654329 @或endOffset@ganeshkaspate @ganeshkaspate 您可以使用它而不是真正抽象的代码,因为这将使您可以轻松更改代码,并且一目了然也更容易理解 好的 Ankit。谢谢您的帮助。很好的解决方案。【参考方案2】:

您可以创建一个包含开始值和结束值的新数组,并通过获取开始值或结束值对它们进行排序。

var data = [ endOffset: "50", startOffset: "25", type: "Education" ,  endOffset: "67", startOffset: "55", type: "address" ,  endOffset: "65", startOffset: "59", type: "project" ,  endOffset: "80", startOffset: "70", type: "fullname" ],
    extended = data.reduce(
        (r,  endOffset, startOffset, type ) =>
            r.concat( startOffset, type ,  endOffset, type ), []);

extended.sort((a, b) => (a.startOffset || a.endOffset) - (b.startOffset || b.endOffset));

console.log(extended);
.as-console-wrapper  max-height: 100% !important; top: 0; 

ES5

var data = [ endOffset: "50", startOffset: "25", type: "Education" ,  endOffset: "67", startOffset: "55", type: "address" ,  endOffset: "65", startOffset: "59", type: "project" ,  endOffset: "80", startOffset: "70", type: "fullname" ],
    extended = data.reduce(function (r, o) 
        return r.concat(
             startOffset: o.startOffset, type: o.type ,
             endOffset: o.endOffset, type: o.type 
        );
    , []);

extended.sort(function (a, b) 
    return (a.startOffset || a.endOffset) - (b.startOffset || b.endOffset);
);

console.log(extended);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

【参考方案3】:

以下排序先按 startOffset,然后按 endOffset:

const array = [
  endOffset: "50",
  startOffset: "25",
  type: "Education"
,

  endOffset: "67",
  startOffset: "55",
  type: "address"
,

  endOffset: "65",
  startOffset: "59",
  type: "project"
,

  endOffset: "80",
  startOffset: "70",
  type:"fullname"
]

console.log(
  array.reduce(
    (result,item)=>result.concat([
      startOffset:item.startOffset,type:item.type,
      endOffset:item.endOffset,type:item.type
    ]),
    []
  ).sort(
    (a,b)=>(a.startOffset||a.endOffset)-(b.startOffset||b.endOffset)
  )
)

【讨论】:

我正在使用 ES5 @ganeshkaspate 然后你使用类型functrion()return 而不是()=> 这很好。实际上,我想以单独的方式拥有它,就像我给的数组一样。 只要有升序,对我来说开始或结束都不会。 @ganeshkaspate 好的,我想我明白你想要什么。更新了答案。

以上是关于在javascript中对具有偏移量的对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

具有动态偏移量的 TSQL 复制 LAG() 函数

使用具有更高偏移量的 LAG 函数

具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目

时区分钟偏移量的 TimeZoneInfo

如何在Vue中对具有2个字段的数组进行排序?

在Angular2中对对象数组进行排序