JavaScript将数组元素移动到数组末尾

4

编辑 - 3个优雅的解决方案

三个解决方案,来自odinho、Pranav和Bekim。感谢你们,经过测试完美运行。

一个(@odinho - 非常酷)

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

两个(也是一个很棒的一句话)
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 数组。 - seahorsepip
你可以复制信息,拼接数组,然后推入数组。或者,正如@e4en刚刚发布的那样,正如我所评论的那样,您可以将其变成一行代码以消除复制信息的步骤。 - ZomoXYZ
1
该数组是否预先排序,还是您正在排序它,然后移动特定的一个元素?如果您正在进行排序,那么您可以编写一个自定义排序算法,始终将该对象放在最后。 - Alan
@BekimBacaj:https://jsfiddle.net/pranavcbalan/90vwyw1j/ :) - Pranav C Balan
顺便说一下,我有点困惑...为什么您在问题中包含了解决方案?我个人更愿意评论答案而不是编辑问题并将其包含在其中。 - kcpr
显示剩余2条评论
3个回答

13

你可以在纯JavaScript(ES6)中使用Array.findIndex方法,而不使用任何库:

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

Array.findIndex是新的,但大多数人实际使用的浏览器都支持它。所以你可以很可能使用它。(Edge支持它,但不支持IE)。

如果您觉得[0]很丑,您可以使用spread解压缩数组(这样它也可以适用于多个项目,只需做出一些更改):

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

ES6 非常适合用于您的网站,当您邀请朋友来家里时向他们展示。 - Bekim Bacaj
ES6非常适合用于编写更优美的生产代码,无论是服务器端还是前端,结合Babel使用 :) - odinho - Velmont
@odinho-Velmont 喜欢这个一句话的风格。非常整洁。谢谢! - Nolan

5

一个普通的(纯粹的)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 );


我想向管理员报告,这段完美简洁的代码和优雅的解决方案已经连续遭受了17个负面投票,这些投票完全是基于仇恨的任意行为,试图损害我的声誉。因此,没有任何评论表明我的这个简洁代码有任何弱点。 但是我不知道该怎么做!非常感谢任何帮助。 - undefined

2

使用简单的for循环

来实现。

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所要求的。你并没有重新排列感兴趣的数组中的目标元素,而是创建和重新创建一个新数组,使目标数组/感兴趣的数组保持不变,并处于相同的状态。也就是说,你的“解决方案”请求被点踩(在这一点上,我将不再费心)。 - Bekim Bacaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接