【发布时间】:2016-10-10 20:52:37
【问题描述】:
编辑 - 2 个优雅的解决方案
Pranav 和 Bekim 提供了两种优雅的解决方案。谢谢,都经过测试并且运行良好。
一个
for(var x in data)data[x].name == "other" ? data.push( data.splice(x,1)[0] ) : 0;
两个
var res = data.slice(),
len = res.length;
for (var i = 0; i < len; i++) {
if (res[i].name == 'other') {
res.push(res.splice(i, 1)[0]);
i--;
len--;
}
}
我正在使用的 JS 工具
Angular 1.5.6,lodash 4.1x
这是我有一个按字母顺序排序的对象数组的场景,例如sortedData 下面等等。但是,在该数组中也是全部Other,它显然也是按字母顺序排序的。我想从数组中删除其他,然后移动到数组的末尾而不弄乱当前的排序数组。
注意
我目前的以下方法可行,但很丑陋。 JS、angular 或 lodash 有更优雅的东西吗?
var data = [
{id:1,name:'apple'},
{id:2,name:'banana'},
{id:3,name:'other'},
{id:4,name:'tomato'},
{id:5,name:'strawberry'}
];
function move(array, fromIndex, toIndex) {
array.splice(toIndex, 1, array.splice(fromIndex, 1)[0]);
return array;
}
var moved = move(
data,
_.findIndex(data, ['name', 'other']),
Object.keys(data).length
);
理想结果
var data = [
{id:1,name:'one'},
{id:2,name:'two'},
{id:4,name:'four'},
{id:5,name:'five'}
{id:3,name:'other'},
]
【问题讨论】:
-
您可以使用
var copy = JSON.parse(JSON.stringify(data));复制data数组 -
你可以复制信息,拼接数组,然后推送数组。或者,正如@e4en 刚刚发布的那样,正如我评论的那样,您可以将其设置为单行来删除信息的复制。
-
数组是预排序的,还是你排序它,然后移动那个特定的元素?如果要对其进行排序,则可以编写一个自定义排序,始终在最后返回一个对象。
-
@Alan 我尝试了 lodash 的排序方法,但我一直遇到问题,坦率地说无法让它工作。最好的我被添加了两次......原来的地方和结束
-
我没有看到 Pranav 解决方案有任何优雅之处,我看到开销和混乱使得整个过程至少比必要的慢 300%,知道这些操作在设计上很慢,增加了三个自分配增量变量对于已经不那么快的原生 JavaScript 数组拼接方法来说有点过多不必要的处理。 (并且要正确引用,您需要将作者姓名的顺序分别切换到相应的 js 表达式/声明)。
标签: javascript angularjs lodash