Javascript 在数组中查找完全唯一的名称
给定一个全名数组,其中每个名称的格式为“lastName,firstName”,我希望找到完全唯一的名称,即给定下面的names数组Javascript 在数组中查找完全唯一的名称,javascript,arrays,Javascript,Arrays,给定一个全名数组,其中每个名称的格式为“lastName,firstName”,我希望找到完全唯一的名称,即给定下面的names数组 const names = [ 'Smith, Joan', 'Smith, John', 'Smith, Sam', 'Thomas, Joan', 'Upton, Joan', 'Upton, Tom', 'Vasquez, Cesar' ] 这是我到目前为止的功能。但是,我想重写它以避免嵌套for
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'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;
}
我会这样写:
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
];
const namesSeen = {};
const uniqueNames = [];
for (const name of names) {
const [last, first] = name.split(", ");
if (!namesSeen[first] && !namesSeen[last]) {
uniqueNames.push(name);
}
namesSeen[first] = true;
namesSeen[last] = true;
}
console.log(uniqueNames);
我注意到您使用的是const,所以我使用了其他一些ES6特性来让代码感觉更自然:解构和for…of循环 我会这样写:
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
];
const namesSeen = {};
const uniqueNames = [];
for (const name of names) {
const [last, first] = name.split(", ");
if (!namesSeen[first] && !namesSeen[last]) {
uniqueNames.push(name);
}
namesSeen[first] = true;
namesSeen[last] = true;
}
console.log(uniqueNames);
我注意到您使用的是const,所以我使用了其他一些ES6特性来让代码感觉更自然:解构和for…of循环 使用设置对象。它是专门设计的,因此每个值中只有一个可以放入其中。它有.hasvalue和.addvalue方法 我还使用for…of循环来遍历列表 演示:
使用Set对象。它是专门设计的,因此每个值中只有一个可以放入其中。它有.hasvalue和.addvalue方法 我还使用for…of循环来遍历列表 演示: 记住我们在使用JavaScript对象哈希时看到的名称。然后,我们可以只运行一次阵列: 函数findUnique{ 常量名称=[ “史密斯,琼”, “史密斯,约翰”, “史密斯,山姆”, “托马斯,琼”, “厄普顿,琼”, “厄普顿,汤姆”, “瓦斯克斯,塞萨尔” ]; firstNames={};//我们已经看到的名字。 lastNames={};//我们已经看到的姓氏。 结果=[]; 对于变量i=0;i
根据你的描述和代码,史密斯,琼不是独一无二的,但你说这是预期的结果,我感到困惑。此外,for循环中的拼接将改变索引。我已经添加了关于什么是唯一的解释。基本上,如果名字或姓氏在被拒绝之前已经存在于一个名字中,乔治、华盛顿和伊恩·乔治被认为是唯一的或不同的?那么正确的结果会根据名字的顺序而改变吗?如果Smith,Sam是数组中的第一个名字,它将出现在结果中,而不是Smith,Joan根据您的描述和代码,Smith,Joan不是唯一的,但您说这是预期的结果,我感到困惑。此外,for循环中的拼接将改变索引。我已经添加了关于什么是唯一的解释。基本上,如果名字或姓氏在被拒绝之前已经存在于一个名字中
,华盛顿和伊恩·乔治被认为是独一无二的或不同的?那么正确的结果会根据名字的顺序而改变吗?如果Smith,Sam是数组中的第一个名字,它将出现在结果中,而不是Smith,这是一个很好的答案!有一件事:你的变量第一个和最后一个在你的destructoring@zfrisch接得好!回答得好!有一件事:你的变量第一个和最后一个在你的destructoring@zfrisch接得好!
const names = [
'Smith, Joan',
'Smith, John',
'Smith, Sam',
'Thomas, Joan',
'Upton, Joan',
'Upton, Tom',
'Vasquez, Cesar'
];
const namesSeen = {};
const uniqueNames = [];
for (const name of names) {
const [last, first] = name.split(", ");
if (!namesSeen[first] && !namesSeen[last]) {
uniqueNames.push(name);
}
namesSeen[first] = true;
namesSeen[last] = true;
}
console.log(uniqueNames);
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);