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
}