给定一个全名数组,其中每个名字的格式为“lastName, firstName”,我想找到完全唯一的名字,即给定下面的名字数组
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
]
- Smith, John # Already saw a last name "Smith" - Smith, Sam # Already saw a last name "Smith" - Thomas, Joan # Already saw a first name "Joan" - Upton, Joan # Already saw a first name "Joan" - Upton, Tom # Already saw a last name "Upton"
I want to have as a result only
Smith, Joan
Vasquez, Cesar
这是我目前拥有的功能。但是,我想重写它以避免嵌套 for 循环并提高性能。
function findUnique() {
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
];
let result = names;
for (var i = 0; i < names.length; i++) {
for (var j = 1; j < names.length; j++) {
let names1 = names[i].split(', ');
let names2 = names[j].split(', ');
if (names1[0] == names2[0] || names1[0] == names2[1] || names1[1] == names2[0] || names1[1] == names2[1]) {
result.splice(i, 1);
}
}
}
return result;
}
最佳答案
使用集合对象。它经过专门设计,因此每个值只能放入其中一个。它有方法 .has(value)
和 .add(value)
我还使用 for...of 循环来遍历列表。
演示:https://jsfiddle.net/6tq00maq/1/
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
]
//set up lists for first and last names
var firstNameList = new Set();
var lastNameList = new Set();
//set place for unique names to be stored
var uniqueNames = [];
//iterate list
for (var name of names) {
var firstName = name.split(", ")[1];
var lastName = name.split(", ")[0];
//check if first name or last name are already indexed
if (!firstNameList.has(firstName) && !lastNameList.has(lastName)) {
//if not, push them to the unique names to return
uniqueNames.push(lastName + ", " + firstName);
}
//add to indexed names
firstNameList.add(firstName);
lastNameList.add(lastName);
}
console.log(uniqueNames);
关于javascript - 在数组中查找完全唯一的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41786272/