Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中查找完全唯一的名称_Javascript_Arrays - Fatal编程技术网

Javascript 在数组中查找完全唯一的名称

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

给定一个全名数组,其中每个名称的格式为“lastName,firstName”,我希望找到完全唯一的名称,即给定下面的names数组

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 函数findUnique{ 常量名称=[ “史密斯,琼”, “史密斯,约翰”, “史密斯,山姆”, “托马斯,琼”, “厄普顿,琼”, “厄普顿,汤姆”, “瓦斯克斯,塞萨尔” ]; firstNames={};//我们已经看到的名字。 lastNames={};//我们已经看到的姓氏。 结果=[]; 对于变量i=0;i 常量名称=[ “史密斯,琼”, “史密斯,约翰”, “史密斯,山姆”, “托马斯,琼”, “厄普顿,琼”, “厄普顿,汤姆”, “瓦斯克斯,塞萨尔” ]; var n=新集合; var unique=names.filterfunctionname{ var np=name.split; 如果n.hasnp[0]| | n.hasnp[1]{ 返回false; } n、 addnp[0]。addnp[1]; 返回true; }; 一个解决方案使用单一的。直接返回结果数组。仅当回调返回true时,才会添加元素

常量名称=[ “史密斯,琼”, “史密斯,约翰”, “史密斯,山姆”, “托马斯,琼”, “厄普顿,琼”, “厄普顿,汤姆”, “瓦斯克斯,塞萨尔” ]; var n=新集合; var unique=names.filterfunctionname{ var np=name.split; 如果n.hasnp[0]| | n.hasnp[1]{ 返回false; } n、 addnp[0]。addnp[1]; 返回true; };
根据你的描述和代码,史密斯,琼不是独一无二的,但你说这是预期的结果,我感到困惑。此外,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);