我想检查数组是否包含"role"
。如果是这样,我想将移到"role"
数组的前面。
var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;
在这里,我得到了结果:
["role", "email", "role", "type", "name"]
我怎样才能解决这个问题?
我想检查数组是否包含"role"
。如果是这样,我想将移到"role"
数组的前面。
var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;
在这里,我得到了结果:
["role", "email", "role", "type", "name"]
我怎样才能解决这个问题?
remove
方法?您是否正在使用Prototype.js或类似的东西?
if('role' in data)
和data.remove()
?
Answers:
您可以对数组进行排序,并指定该值位于"role"
所有其他值之前,并且所有其他值均相等:
var first = "role";
data.sort(function(x,y){ return x == first ? -1 : y == first ? 1 : 0; });
sort
不稳定。
我的第一个想法是:
var data= ["email","role","type","name"];
// if it's not there, or is already the first element (of index 0)
// then there's no point going further:
if (data.indexOf('role') > 0) {
// find the current index of 'role':
var index = data.indexOf('role');
// using splice to remove elements from the array, starting at
// the identified index, and affecting 1 element(s):
data.splice(index,1);
// putting the 'role' string back in the array:
data.unshift('role');
}
console.log(data);
修改并整理一下:
if (data.indexOf('role') > 0) {
data.splice(data.indexOf('role'), 1);
data.unshift('role');
}
参考文献:
Array.indexOf()
两次使用该函数来使它更好一些,因为这意味着它将对整个数组进行两次搜索。``const roleIndex = data.indexOf('role'); 如果(roleIndex> 0){data.splice(roleIndex,1); data.unshift('role'); }`
data.splice
返回刚删除的部分,您可以立即使用它插入,使其成为1行而不是2行,并且还使其对更复杂的情况(如对象数组)很有用:data.unshift(data.splice(roleIndex, 1)[0])
let data = [0, 1, 2, 3, 4, 5];
let index = 3;
data.unshift(data.splice(index, 1)[0]);
// data = [3, 0, 1, 2, 4, 5]
index
为data.findIndex(value)
)都是有用的。
如果您有一个对象数组,则可以通过拼接和推动来移动起始索引。Splice用所需索引开始的数组部分替换原始数组,并返回您删除的部分(索引之前的内容)。
let friends = [{
id: 1,
name: "Sam",
},
{
id: 2,
name: "Steven",
},
{
id: 3,
name: "Tom",
},
{
id: 4,
name: "Nora",
},
{
id: 5,
name: "Jessy",
}
];
const tomsIndex = friends.findIndex(friend => friend.name == 'Tom');
friends.push(...friends.splice(0, tomsIndex));
console.log(friends);
我会选择此ES6解决方案。它不会改变原始数组(考虑到它不是嵌套的),不会遍历该数组(过滤器),并且您不仅仅限于第0个用于移动数组项的索引。
const moveArrayItem = (array, fromIndex, toIndex) => {
const arr = [...array];
arr.splice(toIndex, 0, ...arr.splice(fromIndex, 1));
return arr;
}
const arr = ["a", "b", "c", "d", "e", "f", "g"];
console.log(moveArrayItem(arr, 4, 0))
// [ 'e', 'a', 'b', 'c', 'd', 'f', 'g' ]
in
操作者将性能,不是在数组中的项目。请参阅如何检查数组是否在JavaScript中包含对象?对于其他用途。.remove()
您正在使用的功能是否确实要获取项目的索引。var data= ["email","role","type","name"];
data.splice(data.indexOf("role"), 1);
data.unshift('role');
"role"
。
使用lodash _.sortBy。如果项目是role
,则将首先对其进行排序,否则将对其进行排序。如果没有,这也很好role
var data = ["email", "role", "type", "name"];
var sorted = _.sortBy(data, function(item) {
return item === 'role' ? 0 : 1;
});
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
只是想将其放在此处,因为根据其他评论,古法(Guffa)的答案似乎越来越受到关注,最后的高等教育-这是对该答案的负面评论之一是没有必要的。还使用箭头功能使其看起来更整洁。
而且,它很容易扩展以处理对象数组。
const first = "role";
data.sort((x, y) => first === x ? -1 : first === y)
我相信这也应该解决阵列其余部分受到影响的担忧。当sort函数返回的数字小于0(第一个=== x)时,元素将朝Array的开头移动;当返回0(第一个=== y)时,元素将不移动;当如果数字大于0(第一个=== y),则x将相对于x和y向数组的结尾移动。因此,当x或y都不等于所需的第一个元素(或在对对象进行排序时为标识符)时,两者将不会相对移动。
对于对象:
const unsorted = [{'id': 'test'}, {'id': 'something'}, {'id': 'else'}];
const first = 'something';
const sorted = unsorted.sort((x,y) => x['id'] === first ? -1 : y['id'] === first);
var i = -1;
while (i < data.length) {
if (data[i] === "role") {
data.splice(i, 1);
break;
}
i++;
}
data.unshift("role");
indexOf
仅具有有限的浏览器支持,未被IE7-8识别。因此,即使我是您,也不会使用它,即使牺牲了几行代码的简洁性也是如此。您还想在“ unshift”语句的末尾加上分号。splice()的第一个参数指定开始删除元素的索引,第二个参数指定要删除的参数数目。
var data= ["email","role","type","name"];
if ("role" in data) data.splice(data.indexOf("role"),1); data.unshift("role");
data;