【问题标题】:Inserting an object so the array stays sorted插入一个对象,使数组保持排序
【发布时间】:2017-01-25 11:15:22
【问题描述】:

我有一个不同步骤的枚举

 export enum StepCategory {
    START = 0,
    POSITION_1 = 1,
    TRANSPORT = 2,
    RECEIVER = 3,
    END = 4,
    NO_STEP_MATCH = 5
}

这将在稍后生成一个数组,其中对于每个 Step 我都有一个对象。问题是我不会一次加载所有信息,所以我不能做一个简单的for循环并按时间顺序推送每个项目。我可能是我首先加载第 4 步的值,所以我的数组是:

var array = [{"END" , "POSITIVE"}]

之后我会得到第 2 步的信息,然后我会:

var array = [{"END", "POSITIVE"}, {"TRANSPORT", "POSITIVE"}]

但这没有排序。

我该怎么办?我应该声明一个包含 6 个未定义值的数组

var array = [undefined, undefined, undefined, undefined, undefined, undefined]

这样我在每次更新后不需要任何排序算法,并且可以将值推送到正确的位置。

只是一些小信息:我使用 AngularJS 1、Typescript 和 Lodash

【问题讨论】:

  • 为什么你用值声明一个枚举,但在你的对象中使用文字字符串?
  • var array = [{"END", "POSITIVE"}, {"TRANSPORT", "POSITIVE"}] 这行语法正确吗??
  • 为什么添加步骤时不能对数组进行排序?它是一个 6 项长度的数组,它不会减慢您的应用程序的速度……它基本上是在需要 O(1) 交换的最佳情况下的插入排序
  • @Eddi 是的,它只是为了演示目的。通常会有一个对象插入各种字段和信息。

标签: javascript html angularjs typescript lodash


【解决方案1】:

在纯 Javascript 中,您可以使用对象和键的分配值对其进行排序。

var StepCategory = { START: 0, POSITION_1: 1, TRANSPORT: 2, RECEIVER: 3, END: 4,  NO_STEP_MATCH: 5 },
    array = [["END", "POSITIVE"], ["TRANSPORT", "POSITIVE"]];

array.sort(function (a, b) {
    return StepCategory[a[0]] - StepCategory[b[0]];
});

console.log(array)

【讨论】:

    【解决方案2】:

    首先,正如 cmets 中有人提到的那样,这在语法上不正确:

    var array = [{"END", "POSITIVE"}, {"TRANSPORT", "POSITIVE"}]
    

    我认为这只是写这个问题的一个错字。此外,如果您实际上将数组中的枚举用作键并且只是出于演示目的而将其省略,我希望您的对象数组看起来像这样:

    var array = [{StepCategory.END: "POSITIVE"}, {StepCategory.TRANSPORT: "POSITIVE"}]
    

    为了使用 LoDash 对其进行排序,您可以使用以下内容:

    var sortedArray = _.sortBy(array, i => Object.keys(i)[0]);
    

    这将根据每个对象的第一个键的值对数组进行排序,该键引用您的枚举值。

    【讨论】:

      猜你喜欢
      • 2022-06-24
      • 2012-11-22
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多