将javascript数组中的项移动到特定位置的有效方法

Efficient way to move item in javascript array in a specific position

本文关键字:定位 位置 方法 有效 移动 javascript 数组      更新时间:2023-09-26

我正在寻找一种方法来重新排序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"
    }
]

我必须将项目移动到父级!==在其父项下为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库可以有效地移动项目而不需要大量的递归?

使用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是数组。

我认为您不需要库:

在此检查阵列操作并检查splice()

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

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

不需要递归,两个嵌套循环即可:

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));

这在时间上是"二次型"的,但除非你有数百万个元素,否则会很好地工作。