Javascript 比较一个数组中的项目
Javascript compare items in one array
请原谅我事先完全缺乏JavaScript知识,但我似乎找不到如何比较两个数组并根据结果创建另一个数组的好例子。
我正在尝试从存储设备获取用户帐户列表(使用 javascript 并处理 MOST 函数正常),并将它们与静态创建的"好"用户列表进行比较。
使用 switch 语句有效,但我真的不喜欢它,我相信有一种更好的方法(当我查询它时,userList 是从设备动态填充的):
for (userName = 0; userName < userList.length; userName++) {
switch (userList[userName]) {
case 'someuser1':
printf('Username: ' + userList[userName] + ' is good'n');
break;
case 'someuser2':
printf('Username: ' + userList[userName] + ' is good'n');
break;
case 'someuser3':
printf('Username: ' + userList[userName] + ' is good'n');
break;
default:
printf('Username: ' + userList[userName] + ' is NOT good'n');
}
}
我想创建第三个"坏用户"数组,并将它们与新的"好用户"和"找到的用户"数组进行比较。我从:
var goodUsers = ["someuser1", "someuser2", "someuser3"];
但是,我无法找出多个 for 循环、if 语句或其他方式的正确组合来比较两者并给我一个我可以循环并对其执行操作的"坏用户"数组。
任何帮助将不胜感激!
数组的indexOf
方法很甜蜜。 它返回数组中元素的位置(如果存在),如果不存在,则返回 -1。
var goodUsers = ["someuser1", "someuser2", "someuser3"];
var users = ["someuser1", 'basuser'];
var user;
for (var i=0; i < users.length; i++) {
user = users[i];
if (goodUsers.indexOf(user) >= 0) {
console.log(user + ' is a good user');
} else {
console.log(user + ' is BAD!!!');
}
}
http://jsfiddle.net/qz5fx/1
使用 indexOf
查找数组中是否存在用户。
var goodUsers = ["someuser1", "someuser2", "someuser3"];
var storedUsers = ["someuser1", "user", "user3"];
for(var goodUser in goodUsers){
if(storedUsers.indexOf(goodUsers[goodUser])>-1){
console.log('User:' + goodUsers[goodUser] + ' is good.')
}
}
对于较大的列表,比.indexOf
更有效的方法是将良好的用户列表放入一个对象中,并对该对象使用直接查找。 这也适用于较旧的浏览器,因为它不需要Array.indexOf()
方法。
var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
然后,您可以检查用户是否在该列表中,并且:
if (goodUsers[user])
对于较长的列表,这比使用 indexOf 要高效得多,后者只是遍历数组,将数组中的每个项目与目标进行比较,因为这使用哈希查找(如哈希表)。
如果您有一组候选用户,并且想知道哪些用户在goodUsers
列表中,则可以这样做:
var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
var candidateUsers = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"];
function checkUsers(candidates) {
var goods = [];
for (var i = 0, len = candidates.length; i < len; i++) {
var item = candidates[i];
if (goodUsers[item]) {
goods.push(item);
}
}
return(goods);
}
var validUsers = checkUsers(candidateUsers);
编辑:
虽然这个对象查找在现代Javascript中仍然有效,但现在ES6中有一个Set
和Map
的对象可以更干净,更有效地完成这项工作。 对于用户查找,您可能会使用 Set
对象。
const goodUsers = new Set(["someUser1", "someUser2", "someUser3"]);
goodUsers.add("someUser4");
if (goodUsers.has(user)) {
// user is in the set
}
蛮力方法如下所示:
var users = []; // here is where you get the users from the device
var goodUsers = []; // here you get your good users list
var badUsers = []; // initialize an empty array for bad users
for (var i=0; i< users.length; i++) {
var isAGoodUser = false;
for(var y=0; y< goodUsers.length; y++) {
if(users[i] == goodUsers[y]) {
printf('Username: ' + users[i] + ' is good'n');
isAGoodUser = true;
break;
}
}
if(!isAGoodUser){
printf('Username: ' + users[i] + ' is NOT good'n');
badUsers.push(users[i]);
}
}
我喜欢这个indexOf
方法。小提琴示例:http://jsfiddle.net/8MV3J/
var good = ["someuser1", "someuser2", "someuser3"];
var bad = [];
var ugly = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"];
var i = 0;
var li;
for (i = 0; i < ugly.length; i += 1) {
if (good.indexOf(ugly[i]) === -1) {
bad.push(ugly[i]);
}
}
for (i = 0; i < bad.length; i += 1) {
li = $('<li />').text(bad[i]);
$('ul#bad').append(li);
}
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 按不同项目对对象数组进行排序
- 使用JavaScript或jQuery检查单选按钮选择是否与数组中的项目匹配
- JS:从整个数组中每次得到5个项目,并得到平均值
- 使用圆中的数组更改背景颜色项目
- 编辑CSV数组中的项目-快速CSV node.js
- 我可以限制我添加到数组中的项目数量吗
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- 什么's JavaScript数组中项目的作用域
- 将项目放入数组中
- 使用 id 和 Javascript 从数组中删除项目
- (角度.js)如何通过过滤器计算数组中有多少项目
- 如何通过迭代对象数组来删除某些项目
- Lodash 从与值数组不匹配的数组中获取项目
- 发布要形成的 n 个项目的数组
- 查找数组中项目包含子字符串的索引
- 我怎么能只保留符合特定条件的数组项目
- 关于将数组项目处理为分区的问题
- Php回显数组项目逐个点击(唯一)
- 连续删除数组项目(游戏障碍)