【问题标题】:JavaScript move array element to end of arrayJavaScript 将数组元素移动到数组末尾
【发布时间】: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


【解决方案1】:

使用简单的for loop

var data = [{
  id: 1,
  name: 'apple'
}, {
  id: 2,
  name: 'banana'
}, {
  id: 3,
  name: 'other'
}, {
  id: 4,
  name: 'tomato'
}, {
  id: 5,
  name: 'strawberry'
}];

// store the length of array  
var len = data.length;

// iterate over all array elements
for (var i = 0; i < len; i++) {
  // check value is `other`
  if (data[i].name == 'other') {
    // if value is other then move the object
    data.push(data.splice(i, 1)[0]);
    // decrement i since the element removed
    i--;
    // decrement len to avoid moved element
    len--;
  }
}

console.log(data);

【讨论】:

  • 除此之外,对 js 引擎施加的不必要的开销、代码的笨拙以及完全不合理的功耗 + 时间消耗,这根本不是 OP 所要求的。您不是在感兴趣的数组中重新排序目标元素,而是创建和重新创建一个新数组,使目标数组/感兴趣的数组保持不变并且处于与它已经相同的状态。意思是,您的“解决方案”乞求投反对票(在这一点上,我不会费心给予)。
【解决方案2】:

一个普通的(Vanilla)JavaScript 就可以了:

 for(var x in data)data[x].name == "other" ? data.push( data.splice(x,1)[0] ) : 0;

var data = [
    {id:1,name:'apple'},
    {id:2,name:'banana'},
    {id:3,name:'other'},
    {id:4,name:'tomato'},
    {id:5,name:'strawberry'}
];

for(var x in data)data[x].name == "other" ? data.push( data.splice(x,1)[0] ) : 0;


console.log( data );

【讨论】:

    【解决方案3】:

    您在纯 Javascript (ES6) 中执行 Array.findIndex,而不使用任何库:

    data.push(data.splice(data.findIndex(v => v.name == 'other'), 1)[0])
    

    Array.findIndex is new,但现在人们实际使用的大多数浏览器都有它。所以你可能可以使用它。 (Edge 支持,但 IE 不支持)。

    如果您发现 [0] 丑陋,您可以使用 spread 来解包数组(这样它也可以用于多个项目并进行一些更改):

    data.push(...data.splice(data.findIndex(v => v.name == 'other'), 1))
    

    【讨论】:

    • ES6 非常适合当您的朋友来您家时想向他们展示的网站。
    • ES6 非常适合在生产环境中为任何东西编写更好的代码。带有 babel 的服务器端或前端 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多