这个问题已经在这里有一个答案:
我有一个随机数的数组,从1到6我怎样才能知道我是否有这个阵列中的两个,三个或四个相同的数字吗?什么是多少?或者,如果我有两个数字,它们出现了两次?
array = [1, 3, 5, 5, 6];
x = array[0];
repetitions = 0;
for (let i = 0; i < 5; i++) {
const y = array[i];
if (x === y) {
repetitions++;
}
}
我应该为阵列中的每个元素做这样的事情?
谢谢!
这是可以使用过滤器来提供一个简单的解决方案;
var array = [1,2, 3,4,4,4,4,4,4,4, 5, 5, 6,6,6];
var duplicate = [];
var newArray = array.filter((v, i) =>{
if(array.indexOf(v) == i){
return v
}else{
duplicate.indexOf(v) == -1 ? duplicate.push(v):'';
}
})
console.log(`new array ${newArray}`);
console.log(`Duplicate values array ${duplicate}`);
还有一些你应该明确的限制。例如,这将代码返回被复制的阵列中的第一个数字:
let duplicated = [...array] // makes a copy of the array
.sort() // since `sort` mutate the original
.find((item, index, arr) => value === arr[index + 1]);
console.log(duplicated) // 5, in your case
如果没有数字重复,那么它将返回undefined
。
但是,也许这是不是你想要的。考虑到这阵:[1, 3, 6, 5, 5, 6, 6, 6]
。即使有也6
复制,你将总是返回5
。
如果你只想知道至少有一个号码被复制,上面的代码将作品。如果你想知道所有的复制数量,并在其中为了他们第一次出现在原始数组中,你需要的东西不同。例如:
let array = [1, 3, 6, 5, 5, 6, 6, 6];
let occurrences = array
.reduce((acc, value) => (acc[value]=-~acc[value], acc),{});
console.log(occurrences); // {"1": 1, "3": 1, "5": 2, "6": 4}
在这一点上,你可以决定你要使用此数据,例如做什么你可以滤除出现的数组中只有一次的数字:
console.log(
Object.fromEntries(
Object.entries(occurrences).filter(([num, count]) => count > 1)
)
); // {"5": 2, "6": 4}
等等
UPDATE(见注释):Object.fromEntries
是最近推出的,万一具有所有出现一个过滤的对象的方法是目标,在这种情况下可以通过这样的功能可以容易地更换:
const fromEntries = entries =>
entries.reduce((acc, [key, value]) => (acc[key] = value, acc), {});
您是否在数组中的值存在超过2倍比较indexOf
和lastIndexOf
值
function duplicates(arr){
let result = []
arr.forEach(item => {
if(arr.indexOf(item) !== arr.lastIndexOf(item)){
result.push(item)
}
})
return [... new Set(result)];
}
console.log(duplicates([1,2,3,5,5,6,6,6]));
你可以采取一个qazxsw POI和计数的值的所有事件。
其结果是一个阵列,其中所述第一元件是所述值和所述第二个是值的计数。
Map
var array = [1, 3, 5, 5, 6],
counts = Array.from(array.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map));
console.log(counts);