【问题标题】:JSON Array Ordering based on Origin and Destination基于起点和终点的 JSON 数组排序
【发布时间】:2020-06-08 15:53:49
【问题描述】:

我有一个如下的 JSON 数组我想将我的 JSON 数组排序为 A-B、B-C、C-D、D-E!我正在尝试实现下面提到的输出!我的价值观实际上是航班出发地 - 目的地!例如 ATL-DXB、DXB-MIA、MIA-MAA !所以没有 D-A 场景!我想以某种方式订购它,如果起点是 ATL,那么订购应该从 ATL-DXB 开始!

     function compare(a, b) {
              if (b.origin != a.destination) return 1;

              return 0;
            }
            const jsonArray =  const jsonArray = [
 {
            "origin": "MAA",
            "destination": "AVG"
          },
 {
            "origin": "ATL",
            "destination": "MIA"
          },{
            "origin": "DXB",
            "destination": "MAA"
          }, {
            "origin": "MIA",
            "destination": "DXB"
          }        ];
             var result = jsonArray.sort(compare);

我得到的输出:

  [
    { origin: 'MAA', destination: 'AVG' },
    { origin: 'ATL', destination: 'MIA' },
    { origin: 'DXB', destination: 'MAA' },
    { origin: 'MIA', destination: 'DXB' }
  ]

我想要的输出

 [
    { origin: 'ATL', destination: 'MIA' },
    { origin: 'MIA', destination: 'DXB' },
    { origin: 'DXB', destination: 'MAA' },
    { origin: 'MAA', destination: 'AVG' }

  ]

【问题讨论】:

  • 问题:你的价值观会一直保持这个顺序吗?是否有可能有A-CD-A?如果是,您希望如何处理?
  • 我的价值观其实是航班始发地-目的地!例如 ATL-DXB、DXB-MIA、MIA-MAA !所以没有 D-A 场景!我想以一种方式订购它,如果起点是 ATL,那么订购应该从 ATL-DXB 开始!希望这有意义吗? @AlgefAlmocera
  • return a.origin.localeCompare(b.origin) || a.destination.localeCompare(b.destination)?

标签: javascript node.js json javascript-objects


【解决方案1】:

我想你想找到第一个起点和最后一个目的地之间的路径。

如果我是对的,您需要两个阶段。 首先,找到您的顶级节点,然后根据此重新排序您的节点。

这个解决方案可能不是最有效的,但这是我想到的第一件事。

const jsonArray = [{
            "origin": "MAA",
            "destination": "AVG"
          },
 {
            "origin": "ATL",
            "destination": "MIA"
          },{
            "origin": "DXB",
            "destination": "MAA"
          }, {
            "origin": "MIA",
            "destination": "DXB"
          }];

console.log(sortXY(jsonArray));

function findTop(array) {
  let top = array[0];
  while (true) {
    let temp = array.find(a => a.destination == top.origin);
    if (!temp) {
      break;
    } else {
      top = temp;
    }
  }
  return top;
}

function sortXY(array) {
  let top = findTop(array);
  let newArray = [];
  newArray.push(top);
  while (true) {
    let temp = array.find(a => a.origin == top.destination);
    if (!temp) {
      break;
    } else {
      newArray.push(temp);
      top = temp;
    }
  }
  return newArray;
}

【讨论】:

    【解决方案2】:

    自从问题改变后更新:

    function compare(a, b) {
      if (a.destination == b.origin) return -1;
      if (a.origin == b.destination) return 1;
      return 0;
    }
    const jsonArray = [{
      "origin": "ATL",
      "destination": "MIA"
    }, {
      "origin": "MIA",
      "destination": "DXB"
    }, {
      "origin": "DXB",
      "destination": "MAA"
    }];
    var result = jsonArray.sort(compare);
    
    console.log(result);

    在这种情况下,您可以先按出发地进行比较,然后如果出发地相同,则按目的地进行比较。

    但是,通过阅读您更新的 cmets,在您的情况下,看起来仅比较来源就足够了 :)

    function compare(a, b) {
      let originDiff = a.origin.localeCompare(b.origin);
      return originDiff == 0 ? a.destination.localeCompare(b.destination) : originDiff
    }
    const jsonArray = [{
      "origin": "C",
      "destination": "D"
    }, {
      "origin": "A",
      "destination": "B"
    }, {
      "origin": "D",
      "destination": "E"
    }, {
      "origin": "B",
      "destination": "C"
    }];
    var result = jsonArray.sort(compare);
    
    console.log(result);

    【讨论】:

    • 我以字母表为例!此解决方案不适用于此 JSON const jsonArray = [{ "origin": "ATL", "destination": "MIA" },{ "origin": "DXB", "destination": "MAA" }, { "起源”:“MIA”,“目的地”:“DXB”}];
    • 那就大不一样了。请使用所有新的详细信息、输入和预期输出更新您的答案。我的解决方案适用于您当前的问题,如果问题发生变化,很明显答案可能需要更新。
    • 我已经用更新的细节更新了问题,请看一下
    • 完成,看看
    • 只对三个段有效!如果我添加超过三个它的失败
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多