【问题标题】:Sort array on multiple properties and then update a property based on previous item对多个属性的数组进行排序,然后根据前一项更新属性
【发布时间】:2019-01-22 17:26:59
【问题描述】:

我想创建电视节目列表应用。 我需要调整 tvProgram 单元格大小的函数。

输入

[
  {channel: "x", start: "2019-01-08T06:00:00", distanceFromTop: 6},
  {channel: "y", start: "2019-01-08T06:30:00", distanceFromTop: 9},
  {channel: "x", start: "2019-01-08T07:00:00", distanceFromTop: 9}, 
  {channel: "x", start: "2019-01-08T07:30:00", distanceFromTop: 18},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 13},
  {channel: "x", start: "2019-01-08T08:00:00", distanceFromTop: 15}
]

输出:

[
  {channel: "x", start: "2019-01-08T06:00:00", distanceFromTop: 6},
  {channel: "y", start: "2019-01-08T06:30:00", distanceFromTop: 9},
  {channel: "x", start: "2019-01-08T07:00:00", distanceFromTop: 10},
  {channel: "x", start: "2019-01-08T07:30:00", distanceFromTop: 18},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 19},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 19}
]

我想根据以下条件将 distanceFromTop 加 1。

  1. “开始”必须排序。
  2. 必须对“distanceFromTop”进行排序。
  3. 如果有相同的“start”对象,distanceFromTop 也相同。
  4. 不要减少距离从顶部,只需加 1。
  // wrong
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 13}, // 13 !== 15
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 15}
  distanceFromTop must be also same.
  // correct
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 15}, // 15 === 15
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 15}
ideal data
const ideal = [
  {channel: "x", start: "2019-01-08T06:00:00", distanceFromTop: 6},
  {channel: "y", start: "2019-01-08T06:30:00", distanceFromTop: 9},
  {channel: "x", start: "2019-01-08T07:00:00", distanceFromTop: 10},
  {channel: "x", start: "2019-01-08T07:30:00", distanceFromTop: 18},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 19},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 19}
]

如何创建这个函数

ideal = func(ideal)

我试过下面的代码。

const isSorted = (arr) => {
    var len = arr.length - 1;
    for(var i = 0; i < len; ++i) {
        if(arr[i].distanceFromTop > arr[i+1].distanceFromTop) {
            return false;
        }
    }
    return true;
}

const func = (arr) => {
  output = arr.slice()
  while (isSort(ideal)) {
    addOne(ideal)
  }

  return output
}

请告诉我如何编写 addOne 方法。

【问题讨论】:

  • 不清楚。 I want to add 1 是什么意思?如果两个项目具有相同的start 值,并且具有不同的distanceFromTop,则将distanceFromTop 更新为相同。应该取哪个对象的distanceFromTop?如果两个项目具有相同的start 但具有不同的channel,那么它们是否被视为匹配数据?您应该提供一个涵盖您的场景的输入和输出。

标签: javascript arrays node.js


【解决方案1】:

首先是sort 数组,然后是start,然后是distanceFromTop。然后,您可以使用reduce 执行类似的操作。

获取新distanceFromTop的逻辑:

  • 获取累加器中的last
  • 如果当前项的startlast.start相同,则使用last.distanceFromTop
  • 否则,检查当前distanceFromTop > last.distanceFromTop
  • 如果是,请保持原样。将其添加到累加器中
  • 否则,请使用last.distanceFromTop + 1

const input = [
  {channel: "x", start: "2019-01-08T06:00:00", distanceFromTop: 6},
  {channel: "y", start: "2019-01-08T06:30:00", distanceFromTop: 9},
  {channel: "x", start: "2019-01-08T07:00:00", distanceFromTop: 9}, 
  {channel: "x", start: "2019-01-08T07:30:00", distanceFromTop: 18},
  {channel: "y", start: "2019-01-08T08:00:00", distanceFromTop: 13},
  {channel: "x", start: "2019-01-08T08:00:00", distanceFromTop: 15}
]

const sorted = input.sort((a, b) => a.start.localeCompare(b.start) 
                                || a.distanceFromTop - b.distanceFromTop);
                                
const output = sorted.reduce((acc, { channel, start, distanceFromTop }) => {
     if (acc.length === 0)
       return [{channel,start,distanceFromTop}];

     const last = acc[acc.length - 1];
     const newDistanceFromTop = last.start === start 
                                 ? last.distanceFromTop 
                                 : distanceFromTop > last.distanceFromTop 
                                 ? distanceFromTop 
                                 : last.distanceFromTop + 1;

     return [...acc, { channel, start, distanceFromTop: newDistanceFromTop}];
  }, [])

console.log(output)

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多