将javascript数组中的项移动到特定位置的有效方法
Efficient way to move item in javascript array in a specific position
我正在寻找一种方法来重新排序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));
这在时间上是"二次型"的,但除非你有数百万个元素,否则会很好地工作。
相关文章:
- 在地图加载/页面加载时,我想将地图设置为当前地理位置,但不想在地图上显示定位图标
- JQuery定位:我可以滚动到正确的位置一次,但不能滚动两次
- 如何在jquerymobile中同时放置两个定位的经纬度位置
- Javascript / 根据一个元素的位置定位另一个元素
- 如何定位“隐藏”的 iframe?(应用程序:链接到嵌入“隐藏的海报图像”嵌入的 Youtube 视频的起始位置)
- 与位置的相对定位:绝对
- 在没有“位置”属性的情况下实现绝对定位,使用边距/填充
- 用于相对于用户在约束内单击的位置定位框的数学公式
- 运行地理位置定位的 js 文件
- 如果定位服务关闭,英特尔 XDK 地理位置将找不到纬度/经度
- 在 iPad 上绝对定位不会将元素设置在所需位置
- 如何使用 jQuery 计算相对定位元素的绝对位置*没有*
- 如果php返回位置头,我如何在jquery ajax中定位页面
- 试着根据父母的位置来定位孩子
- 地理定位api没有给出准确的用户位置
- 定位父元素,使子元素处于完全相同的位置
- 如何在Javascript/Mootools中根据页面上不同对象的位置定位箭头
- 使用javascript查找元素相对于最近相对定位的父元素的位置
- 多个谷歌位置请求功能(药房定位器)
- 点击html5地理定位当前位置,然后减去两点