【问题标题】:Efficient way to move item in javascript array in a specific position将javascript数组中的项目移动到特定位置的有效方法
【发布时间】:2015-03-27 17:23:49
【问题描述】:

我正在寻找一种方法来重新排序 javascript 中的数组,将元素移动到特定位置。

我的数组是:

[
    {
        "id": 105142,
        "parent": null,
        "created": "2015-03-20T17:21:33.013+01:00"
    },
    {
        "id": 105150,
        "parent": null,
        "created": "2015-03-20T19:02:09.079+01:00"
    },
    {
        "id": 105160,
        "parent": null,
        "created": "2015-03-20T22:15:06.543+01:00"
    },
    {
        "id": 105190,
        "parent": null,
        "created": "2015-03-21T19:39:19.441+01:00"
    },
    {
        "id": 105193,
        "parent": null,
        "created": "2015-03-22T01:42:00.974+01:00"
    },
    {
        "id": 105195,
        "parent": 105193,
        "created": "2015-03-22T11:05:20.033+01:00"
    },
    {
        "id": 105197,
        "parent": null,
        "created": "2015-03-22T11:06:15.241+01:00"
    },
    {
        "id": 105203,
        "parent": 105193,
        "created": "2015-03-22T22:22:48.833+01:00"
    }
]

我必须将 parent !== null 的项目移到其父项下。 结果将是:

[
    {
        "id": 105142,
        "parent": null,
        "created": "2015-03-20T17:21:33.013+01:00"
    },
    {
        "id": 105160,
        "parent": 105142,
        "created": "2015-03-20T22:15:06.543+01:00"
    },
    {
        "id": 105150,
        "parent": null,
        "created": "2015-03-20T19:02:09.079+01:00"
    },
    {
        "id": 105190,
        "parent": null,
        "created": "2015-03-21T19:39:19.441+01:00"
    },
    {
        "id": 105193,
        "parent": null,
        "created": "2015-03-22T01:42:00.974+01:00"
    },
    {
        "id": 105195,
        "parent": 105193,
        "created": "2015-03-22T11:05:20.033+01:00"
    },
        {
        "id": 105203,
        "parent": 105193,
        "created": "2015-03-22T22:22:48.833+01:00"
    },
    {
        "id": 105197,
        "parent": null,
        "created": "2015-03-22T11:06:15.241+01:00"
    }
]

是否有任何 js 库可以有效地移动项目而无需大量递归?

【问题讨论】:

  • 你为什么害怕递归?

标签: javascript arrays


【解决方案1】:

使用Array.prototype.sort 应该是个好主意。唯一棘手的是比较的关键。在这里,一个子节点应该大于它的父节点;子节点及其父节点都应大于或小于其他节点。所以通过它自己和它的父母的钥匙来比较钥匙。下面的代码展示了如何做到这一点:

var re = {};
for (var i = 0, l = a.length; i < l; i++) re[a[i].id] = a[i];
var id = function (x) {
  var r = [x];
  for (; x; x = re[x].parent) {
    r.unshift(x);
  }
  return r.join('-');
};
a.sort(function (x, y) {
  if (x === y) return 0;
  if (id(x.id) > id(y.id)) return 1; else return -1;
});

这里,a 是数组。

【讨论】:

    【解决方案2】:

    我认为你不需要图书馆:

    检查数组操作here 和检查splice()

    强大的 splice() 方法可让您从数组中的任意点添加和/或删除一个或多个元素:

    你只需要找到对象,存储它,从数组中删除并插入到新的位置。

    【讨论】:

      【解决方案3】:

      不需要递归,两个嵌套循环就可以了:

      data = [
          {
              "id": 105142,
              "parent": null,
              "created": "2015-03-20T17:21:33.013+01:00"
          },
          {
              "id": 105150,
              "parent": null,
              "created": "2015-03-20T19:02:09.079+01:00"
          },
          {
              "id": 105160,
              "parent": null,
              "created": "2015-03-20T22:15:06.543+01:00"
          },
          {
              "id": 105190,
              "parent": null,
              "created": "2015-03-21T19:39:19.441+01:00"
          },
          {
              "id": 105193,
              "parent": null,
              "created": "2015-03-22T01:42:00.974+01:00"
          },
          {
              "id": 105195,
              "parent": 105193,
              "created": "2015-03-22T11:05:20.033+01:00"
          },
          {
              "id": 105197,
              "parent": null,
              "created": "2015-03-22T11:06:15.241+01:00"
          },
          {
              "id": 105203,
              "parent": 105193,
              "created": "2015-03-22T22:22:48.833+01:00"
          }
      ]
      
      result = [];
      
      data.forEach(function(x) { 
          if(!x.parent) {
              result.push(x);
              data.forEach(function(y) {
                  if(y.parent == x.id)
                      result.push(y)
              })
          }
      })
      
      document.write("<pre>" + JSON.stringify(result,0,3));

      这在时间上是“二次的”,但除非你有数百万个元素,否则它可以正常工作。

      【讨论】:

      • 我的数组中最多有 100 个项目。
      猜你喜欢
      • 2019-10-27
      • 2022-11-14
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多