Javascript 在保持元素一致性的同时旋转数组元素的最佳方法';身份证件

Javascript 在保持元素一致性的同时旋转数组元素的最佳方法';身份证件,javascript,Javascript,给定一组对象: var array = [ { some_id: 0, name:'a' }, { some_id: 1, name:'b' }, { some_id: 2, name:'c' }, { some_id: 3, name:'d' }, { some_id: 4, name:'e' }, { some_id: 5, name:'f' } ]; 在更新被移动元素的某些id值时,将某些id=4的对象移动到位置某些id=1的最佳方法是什么

给定一组对象:

var array = [
    { some_id: 0, name:'a' },
    { some_id: 1, name:'b' },
    { some_id: 2, name:'c' },
    { some_id: 3, name:'d' },
    { some_id: 4, name:'e' },
    { some_id: 5, name:'f' }
];
在更新被移动元素的
某些id
值时,将
某些id=4
的对象移动到位置
某些id=1
的最佳方法是什么,以使数组中
某些id
值的顺序在转换后保持不变

例如,将
some_id=4
移动到
some_id=1
后,您会得到:

array = [
    { some_id: 0, name:'a' },
    { some_id: 1, name:'e' },
    { some_id: 2, name:'b' },
    { some_id: 3, name:'c' },
    { some_id: 4, name:'d' },
    { some_id: 5, name:'f' }
];
基本上应该发生的是:

  • 我们将
    {some_id:4,name:'e'}
    移动到
    {some_id:1,name:'e'}
  • 我们将
    {some_id:1,name:'b'}
    移动到
    {some_id:2,name:'b'}
  • 我们将
    {some_id:2,name:'c'}
    移动到
    {some_id:3,name:'c'}
  • 我们将
    {some_id:3,name:'d'}
    移动到
    {some_id:4,name:'d'}

  • 因此,我们只是旋转元素并更改
    某些id
    值。请注意,我们不涉及对象的任何其他属性。

    您可以使用拼接方法,该方法允许您将元素添加/删除到数组中的元素。要将索引1的元素移动到索引4中,请执行以下操作:

    element = arr.splice(1, 1);
    arr.splice(4, 0, element);
    
    您可以交替地将这两项合并为一行:

    arr.splice(4, 0, arr.splice(1,1));
    
    以下是有关拼接方法的页面:

    就更新id而言,我会循环遍历数组以将id与当前索引相匹配(因为在您的示例中,您只是移动元素e,而不是将其替换为元素b):


    我能想到的“在更新元素标识符时拖放元素”的“最佳”方式如下:

    函数移动(键、src、to、数组){
    var length=array.length
    if(length==0)返回数组
    var srcIndex=-1
    var toIndex=-1
    var指数=0
    循环:do开关(数组[索引][键]){
    案例src:srcIndex=index++;中断循环
    大小写为:toIndex=index++;中断循环}
    而(++索引<长度)
    if(index==长度)返回数组
    if(srcIndex<0)do if(数组[index][key]==src){
    srcIndex=index;break}
    而(++索引<长度)
    如果(数组[index][key]==to),则执行其他操作{
    toIndex=索引;中断}
    而(++索引<长度)
    if(index==长度)返回数组
    var step=toIndex
    
    setTimeout(函数(){
    变量数组=[
    {some_id:0,名称:'a'},
    {some_id:1,name'b'},
    {some_id:2,name'c'},
    {some_id:3,name'd'},
    {some_id:4,name'e'},
    {some_id:5,名称:'f'}
    ];
    打印(移动(“some_id”,4,1,数组));
    打印(移动(“some_id”,1,4,数组));
    函数打印(数组){
    警报(“[\n”+array.map(函数(obj)){
    返回“{some_id:”+obj.some_id+
    “,名称:'”+obj.name+“}”;
    }).join(“,\n”)+“\n]”;
    }
    }, 0);
    
    这是对AaditMShah答案稍加修改、重新格式化的版本

    function move(key, src, to, array) {
    
        var srcIndex = -1, toIndex  = -1;
    
        for( var i = 0, l = array.length; i < l; i++ ) {
           switch(array[i][key]) {
               case src: 
                  srcIndex = i; 
                  break;
               case to: 
                  toIndex  = i; 
                  break;
           }
    
           if ( srcIndex > -1 && toIndex > -1 ) {
              break;
           }
        }
    
        if ( (srcIndex == -1 || toIndex == -1) || (srcIndex == toIndex )
          return array
    
        var step = toIndex < srcIndex ? 1 : -1
            src  = array[srcIndex]
    
        do {
            to   = array[toIndex]
            array[toIndex] = src
            src[key] = toIndex
            toIndex += step
            src = to
        } while (toIndex !== srcIndex);
    
        array[toIndex] = src
        src[key] = toIndex
    
        return array                                                                
    }
    
    函数移动(键、src、to、数组){
    var srcIndex=-1,toIndex=-1;
    for(var i=0,l=array.length;i-1&&toIndex>-1){
    打破
    }
    }
    如果((srcIndex==1 | | toIndex==1)| |(srcIndex==toIndex)
    返回数组
    var step=toIndex
    使用什么比较标准的“最佳”方法?它确实不是一个有效的数组
    var o=arr[arr[4]。index=1];arr[1]=arr[1]。index=4],arr[4]=o;
    应该这样做。或者尝试
    arr.splice(arr[4]。index=1,1,arr.splice(4,1,a[1])[0]).index=4;
    @zerkms请告诉我,如果我添加的编辑对您有帮助,为什么您要创建一个带有
    index
    属性的对象数组,而数组本身对每个元素都有索引?这不会产生正确的输出。
    某些id
    值没有正确更新。问题的内容已更改,这对h有效现在我明白了原来的意思。在那里,我添加了一种在移动元素后更新id的方法。@Alnitak我删除了分号以使其更漂亮…;;;;;;;;;;;.25分号。谢谢。最后一个do…while是我要寻找的金块。不确定这行解决了什么问题:if(srcdex<0)do if(array[index][key]==src)。你能解释一下吗?我们需要找到两个索引,
    srcdex
    toIndex
    。第一个循环找到
    srcdex
    toIndex
    ,但不是两个都找到(以先到的为准)。因此我们需要第二个循环来找到第二个索引(可能是
    srcIndex
    toIndex
    function move(key, src, to, array) {
    
        var srcIndex = -1, toIndex  = -1;
    
        for( var i = 0, l = array.length; i < l; i++ ) {
           switch(array[i][key]) {
               case src: 
                  srcIndex = i; 
                  break;
               case to: 
                  toIndex  = i; 
                  break;
           }
    
           if ( srcIndex > -1 && toIndex > -1 ) {
              break;
           }
        }
    
        if ( (srcIndex == -1 || toIndex == -1) || (srcIndex == toIndex )
          return array
    
        var step = toIndex < srcIndex ? 1 : -1
            src  = array[srcIndex]
    
        do {
            to   = array[toIndex]
            array[toIndex] = src
            src[key] = toIndex
            toIndex += step
            src = to
        } while (toIndex !== srcIndex);
    
        array[toIndex] = src
        src[key] = toIndex
    
        return array                                                                
    }