我在一个javascript测试中遇到了这个问题,我需要打印前两个非重复的数字,下面是我的部分尝试。
var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];
var locObj = {};
var count = 1;
for(var i =0; i< list.length; i++){
if(!(list[i] in locObj))
locObj[list[i]] = 1;
else
locObj[list[i]] = count++;
}
console.log(locObj);//has an object with value as 1 if its non duplicate and the number of occurrences in the case of duplicate values.
我可以进一步遍历locObj并确定谁的值等于1,然后打印2个值。但是由于javascript键没有被排序,所以我无法打印66和7,这是预期的输出。如何解决?感谢任何其他更好的解决问题的方法。
发布于 2019-07-21 21:21:22
您可以首先将数字映射为键,将重复映射为值,然后在数组上再次循环,并在映射对象上选择值为1的前两个数字
var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];
let mapping = list.reduce((op,inp)=>{
op[inp] = op[inp] || 0
op[inp]++
return op
},{})
let firstTwo = []
list.forEach(v=> {
if(mapping[v] === 1 && firstTwo.length < 2){
firstTwo.push(v)
}
})
console.log(firstTwo);
发布于 2019-07-21 21:18:49
我将使用一个Map,它的迭代方法(这里是entries()
)按插入顺序迭代。将计数加到Map中,类似于您正在做的操作,然后获取Map的条目,根据计数为1的条目进行过滤,然后进行切片以获得前两个条目:
var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];
const countByNum = new Map();
list.forEach((num) => {
countByNum.set(num, (countByNum.get(num) || 0) + 1);
});
const firstTwoNonDupes = [...countByNum.entries()]
.filter(([, count]) => count === 1)
.slice(0, 2)
.map(([num]) => num);
console.log(firstTwoNonDupes);
发布于 2019-07-22 00:21:53
您可以采用Map
和Set
的组合,其中映射只存储已见的值,并将其作为可见的值的结果集。
function getFirstTwoNonDuplicateValues(array) {
var map = new Map,
result = new Set,
value;
for (value of array) map.set(value, map.has(value)
? result.delete(value)
: result.add(value));
return [...result].slice(0, 2);
}
console.log(getFirstTwoNonDuplicateValues([5, 23, 23, 5, 66, 3, 23, 7, 3, 0]));
https://stackoverflow.com/questions/57133559
复制相似问题