【问题标题】:sorting for array object needed in JavaScript using default .sort()使用默认 .sort() 对 JavaScript 中所需的数组对象进行排序
【发布时间】:2017-02-07 12:56:00
【问题描述】:

我有一个数组:

var array = [
{ID : 1,
Name : one,
data : {more info here}
},
{ID : 2,
Name : two
},
{ID : 3,
Name : three,
data : {more info here}
},
{ID : 4,
Name : four
},
{ID : 5,
Name : five,
data : {more info here}
},]

需要对这些数组进行排序,有数据的地方会排在最前面,然后是其他。 最终排序结果将是 -

[{ID:1,name: one,data: {}},
{ID:3,name: three,data: {}},
{ID:5,name: five,data: {}},
{ID:2,name: two},
{ID:4,name: four}]

【问题讨论】:

  • 通过“存在数据的位置将是顶部,然后是其他”,您的意思是您实际上是希望所有具有data 的人首先,按递增的ID 顺序排序,然后是所有没有@987654325 的人@也按递增的ID顺序排序?
  • 顺便说一句:如果您以随机顺序提供输入数组会更好。事实上,一些答案依赖于数组的输入顺序,最终得到您指定为输出的整体数组顺序。如果您只关心所有带有data 的人应该排在所有没有data 的人之前,并且您不在乎他们在这两组中的顺序,那么提供随机输入可能无关紧要。也就是说,如果IDs 的顺序是[5,1,3,4,2],那么数组结果是OK的,那么这可能无关紧要吗?
  • 注意:我投了反对票,因为您的问题目前并未表明结果数组是否也应按ID 排序(即您的问题暗示可能是这种情况,但尚不清楚)。如果您澄清您是否关心ID 在有data/没有data 子组中的顺序,我将删除我的反对票。如果您确实澄清了这一点(一种或另一种方式),请在其中留下@Makyen 的评论,以便通知我回来查看。

标签: javascript arrays sorting


【解决方案1】:

您可以使用属性的布尔值的增量。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }];

array.sort(function (a, b) {
    return !a.data - !b.data;
});

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

另一个强调密钥的版本可能是存在检查。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }];

array.sort(function (a, b) {
    return ('data' in b) - ('data' in a);
});

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

【讨论】:

  • 从问题中不清楚是否需要,但这目前依赖于输入数组的顺序以使结果最终与请求的输出数组顺序匹配。换句话说,您不检查ID 是否在有data 和没有data 组内进行排序。换句话说,您依赖已按 ID 排序的输入数组,以便您的 data/non-data 组按 ID 排序。
  • 你是对的,给定的排序参数结果并不稳定。为了得到一个稳定的值,需要添加另一个参数进行排序。
【解决方案2】:

从问题中不清楚在所需排序中唯一重要的是data 属性的存在与否。所需的“最终排序结果”显示数据首先按 data 的存在与否排序,然后在这些组中按 ID 的升序排序。按ID 排序可能只是起始数组顺序的产物,而不是问题的必需部分。另一方面,可能需要同时按dataID 进行排序。

其他解决方案要么根本不根据ID (Nina Scholz's answer) 进行排序,要么同时根据dataID 进行排序,但根据输入数组(Rajesh's answer) 会错误地这样做.两者都依赖输入数组的顺序来提供所需的结果数组。

以下代码将首先根据data 的存在或不存在对数组进行排序,然后根据ID 在这两个子组中进行排序。

对原来提供的输入数组进行排序:

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }];

array.sort(function(a, b) {
  if(a.data && !b.data) {
    // a has data, b does not have data, a is first
    return -1;
  }
  if(!a.data && b.data) {
    // a does not have data, b does have data, b is first
    return 1;
  }
  // a and b either both have data, or both don't have data. Sort the smaller ID first.
  return a.ID - b.ID;
});
console.log(array)

下面是相同的排序,输入数组从Rajesh's updated answer 中使用的数组稍加修改。该答案中的数组已修改为将ID:4, 更改为ID:41,。使用修改后的输入数组,Rajesh 的排序将产生错误的结果。此代码将按dataID 正确排序。

var array=[{ID:1,Name:"one",data:{"more info here":"something"}},{ID:2,Name:"two"},{ID:30,Name:"Thirty",data:{"more info here":"something"}},{ID:41,Name:"four"},{ID:5,Name:"five",data:{"more info here":"something"}},{ID:40,Name:"fourty",data:{"more info here":"something"}},{ID:300,Name:"threeHundred",data:{"more info here":"something"}},{ID:20,Name:"twenty"},{ID:3e3,Name:"threeThousand",data:{"more info here":"something"}}];

array.sort(function(a, b) {
  if(a.data && !b.data) {
    // a has data, b does not have data, a is first
    return -1;
  }
  if(!a.data && b.data) {
    // a does not have data, b does have data, b is first
    return 1;
  }
  // a and b either both have data, or both don't have data. Sort the smaller ID first.
  return a.ID - b.ID;
});
console.log(array)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 2021-05-28
    • 2022-06-17
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多