Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.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 如何优化嵌套“for”到函数式编程_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 如何优化嵌套“for”到函数式编程

Javascript 如何优化嵌套“for”到函数式编程,javascript,angular,typescript,Javascript,Angular,Typescript,我创建了一个函数来检查列表中是否有重复的手机号码。问题是,我是通过使用nested for来实现的。如何使用函数式编程优化此代码 checkDuplicate:布尔值{ 对于let i=0;i{ 让计数={}; 电话中的福莱特电话{ ifcounts[phone.number]返回true; 计数[电话号码]=1; } 返回false; } ifcheckDuplicatethis.phoneList{ 此.toastrService.error'Phone已在列表中!'; } 您可以使用Ar

我创建了一个函数来检查列表中是否有重复的手机号码。问题是,我是通过使用nested for来实现的。如何使用函数式编程优化此代码

checkDuplicate:布尔值{ 对于let i=0;i} 甚至比我在评论使用集中建议的过滤器更好——有几种方法可以做到这一点,但这是非常干净的。然而,过滤器可能会被认为更具“功能”,因为它是一个特殊的过滤器

let a = [1,2,1,3,3,5]
let x = [...new Set(a)]

// => [1, 2, 3, 5]

甚至比我在评论使用集中建议的过滤器更好——有几种方法可以做到这一点,但这是非常干净的。然而,过滤器可能会被认为更具“功能”,因为它是一个特殊的过滤器

let a = [1,2,1,3,3,5]
let x = [...new Set(a)]

// => [1, 2, 3, 5]

你可以这样做:

let dups = this.phoneList.filter(item =>
    this.phoneList.filter(item2 => item.number == item2.number).length > 1
);
if (dups.length) {
    this.toastrService.error('Phone already in List!');
    return true;
}

…尽管它在可读性方面有点困难。

您可以执行以下操作:

let dups = this.phoneList.filter(item =>
    this.phoneList.filter(item2 => item.number == item2.number).length > 1
);
if (dups.length) {
    this.toastrService.error('Phone already in List!');
    return true;
}
…尽管它的可读性有点差。

关于解决方案 这不是功能性的,但它是迄今为止最快的

const checkDuplicate=电话=>{ 让计数={}; 电话中的福莱特电话{ ifcounts[phone.number]返回true; 计数[电话号码]=1; } 返回false; } ifcheckDuplicatethis.phoneList{ 此.toastrService.error'Phone已在列表中!'; }论解决 这不是功能性的,但它是迄今为止最快的

const checkDuplicate=电话=>{ 让计数={}; 电话中的福莱特电话{ ifcounts[phone.number]返回true; 计数[电话号码]=1; } 返回false; } ifcheckDuplicatethis.phoneList{ 此.toastrService.error'Phone已在列表中!'; } 您可以使用Array.some检查电话号码是否重复,如下所示。在循环回调中,电话号码是添加到exists对象的布尔值的键。回调函数返回true时,循环立即停止,当在exists中找到与循环项对应的键/值时,就会发生这种情况

有关演示,请参阅。

您可以使用Array.some检查电话号码是否重复,如下所示。在循环回调中,电话号码是添加到exists对象的布尔值的键。回调函数返回true时,循环立即停止,当在exists中找到与循环项对应的键/值时,就会发生这种情况


请参阅以获取演示。

您可以制作一个仅包含唯一数字的集合,并将集合的长度与原始阵列的长度进行比较

hasDuplicates(): boolean {
  return new Set(this.phoneList.map(p => p.number)).size < this.phoneList.length
}

您可以创建一个仅包含唯一数字的集合,并将集合的长度与原始数组的长度进行比较

hasDuplicates(): boolean {
  return new Set(this.phoneList.map(p => p.number)).size < this.phoneList.length
}

这并不是关于角度,而是关于JavaScript。您可以尽可能快地缩短列表上的循环

由于我们已经检查了这些内部循环,因此每个内部循环的执行/检查速度都快了n-i 变量xObj={ 电话列表:[{ 姓名:弗雷迪, 电话:555121234 }, { 姓名:吉米, 电话:555121234 }, { 名字:妈妈, 电话:555121233 }, { 姓名:汤米, 电话:555121244 }, { 姓名:卢卡, 电话:555121222 }, { 姓名:彭妮, 电话:555121255 }, { 姓名:萨米, 电话:555121266 }, { 姓名:比尔,, 电话:555121244 } ], 电话列表2:[{ 姓名:弗雷迪, 电话:555121234 }, { 姓名:吉米, 电话:555121235 }, { 名字:妈妈, 电话:555121233 }, { 姓名:汤米, 电话:555121244 }, { 姓名:卢卡, 电话:555121222 }, { 姓名:彭妮, 电话:555121259 }, { 姓名:萨米, 电话:555121266 }, { 姓名:比尔,, 电话:555121247 } ], toastrService:{ 错误:functionmessage{ console.logmessage; } }, 检查重复:函数{ 设hasDupe=false 对于let i=0;iconsole.logdup:,cdup,cdup2 这并不是关于角度,而是关于JavaScript。您可以尽可能快地缩短列表上的循环

由于我们已经检查了这些内部循环,因此每个内部循环的执行/检查速度都快了n-i 变量xObj={ 电话列表:[{ 姓名:弗雷迪, 电话:555121234 }, { 姓名:吉米, 电话:555121234 }, { 名字:妈妈, 电话:555121233 }, { 姓名:汤米, 电话:555121244 }, { 姓名:卢卡, 电话:555121222 }, { 姓名:彭妮, 电话:555121255 }, { 姓名:萨米, 电话:555121266 }, { 姓名:比尔,, 电话:555121244 } ], 电话列表2:[{ 姓名:弗雷迪, 电话:555121234 }, { 姓名:吉米, 电话:555121235 }, { 名字:妈妈, 电话:555121233 }, { 姓名:汤米, 电话:555121244 }, { 姓名:卢卡, 电话:555121222 }, { 姓名:彭妮, 电话:555121259 }, { 姓名:萨米, 电话:555121266 }, { 姓名:比尔,, 电话:555121247 } ], toastrService:{ 错误:functionmessage{ console.logmessage; } }, 检查重复:函数{ 设hasDupe=false 对于let i=0;iconsole.logdup:,cdup,cdup2;checkout Array.filterOptimal还将取决于实际数据和浏览器,因为在非常旧的浏览器上,这是一个负数,而this.phoneList.length-将更快回答您的问题吗?checkout Array.filterOptimal还将取决于实际数据和浏览器,因为在非常旧的浏览器上,这是一个负数,而this.phoneList.length-将更快回答您的问题吗?确实是干净的,但是从OP的代码来看,数组中的每个项都是一个对象,因此引用了.number,所以这不起作用。确实是干净的,但是从OP的代码来看,数组中的每个项都是一个对象,因此引用了.number,所以这不起作用。尽管它的可读性有点问题。和性能,因为它在^2上与OP的解决方案相同。尽管它在可读性方面有点问题。和性能,因为它在^2上与OP的解决方案相同。这仍然在^2上。是的,它比遍历整个数组要快,但它不会改变时间复杂度。它还取决于数组,因为如果第一个和第二个匹配,或者如果第二个和第三个匹配,则在该点使用true完成。这也适用于较旧的浏览器。较旧的浏览器没有设置,但您仍然可以使用普通对象,也可以使用普通对象遍历数组并跟踪值。您仍然可以获得恒定的时间检索,并且算法的整个复杂性都已启用。事实上,对于一个对象,您将获得相同的最佳案例复杂度以及更好的平均和更差的案例复杂度的好处。这仍然在^2上。是的,它比遍历整个数组要快,但它不会改变时间复杂度。它还取决于数组,因为如果第一个和第二个匹配,或者如果第二个和第三个匹配,则在该点使用true完成。这也适用于较旧的浏览器。较旧的浏览器没有设置,但您仍然可以使用普通对象,也可以使用普通对象遍历数组并跟踪值。您仍然可以获得恒定的时间检索,并且算法的整个复杂性都已启用。事实上,对于一个对象,您将获得相同的最佳大小写复杂度以及更好的平均大小写复杂度和更差的大小写复杂度的好处。请详细说明您的答案如何与此进行比较。phoneList.number for Duplicates此项仍然失败,请更改为let counts={};若要以这种方式正确使用object属性,请详细说明您的答案如何比较this.phoneList.number是否存在重复项此操作仍然失败,请更改为let counts={};以这种方式正确使用对象属性