在数组中查找单个元素的出现次数

3

我正在尝试在数组中查找一个元素的单个出现。但它只显示了1个元素。逻辑错在哪里?

function findSingle(array){
  var arrayCopy = array.slice(0);
  var x;
  var y = [];

  for (var i = 0; i < array.length; i++) {
    x = arrayCopy.splice(i, 1)
    if(arrayCopy.includes(array[i]) === false){
      console.log(array[i] + " is single")
    }
    arrayCopy = arrayCopy.concat(x)
   }
 }

findSingle([1, 3, 3, 6])

请澄清一下,您是想找出数组中所有只出现一次的元素吗?所以在您的例子中,期望的答案是 [1, 6] 吗? - slider
如果我有 [1, 3, 3, 6, 8, 4, 6],那么答案是 1, 8, 4,因为它们在数组中只出现一次。 - Deke
const findSingle=a=>a.filter((v,i)=>a.lastIndexOf(v)===array.indexOf(v)); - Jaromanda X
3个回答

8

输入 [1, 3, 3, 6, 8, 4, 6] 的预期答案是 1, 8, 4 - Jaromanda X
太棒了。我也向这个答案点了赞。 - Deke

2
我添加了一些console.logs来查看发生了什么问题,原因是你改变了arrayCopy中元素的顺序。 因此,6从未被检查。
Checking for [ 1 ]
arrayCopy is [ 3, 3, 6 ]
1 is single
After adding to arrayCopy [ 3, 3, 6, 1 ]
Checking for [ 3 ]
arrayCopy is [ 3, 6, 1 ]
After adding to arrayCopy [ 3, 6, 1, 3 ]
Checking for [ 1 ]
arrayCopy is [ 3, 6, 3 ]
After adding to arrayCopy [ 3, 6, 3, 1 ]
Checking for [ 1 ]
arrayCopy is [ 3, 6, 3 ]
After adding to arrayCopy [ 3, 6, 3, 1 ]

您可以使用频率映射来查找每个元素中出现的次数,然后过滤仅出现一次的键。

function findSingle(array){
  var freqs = {};
  array.forEach(n => {
    if (!(n in freqs)) freqs[n] = 1;
    else freqs[n] += 1;
  });
  return Object.keys(freqs).filter(k => freqs[k] === 1);
}

1
这可以通过创建一个能够映射元素及其出现次数的对象来实现。 以下是代码:
function findSingle(arr){
    var counts = {};
    var singles = [];
    for (var i = 0; i < arr.length; i++) {
        var num = arr[i];
        counts[num] = counts[num] ? counts[num] + 1 : 1;
    }
    for(var num in counts) {
        if(counts[num] == 1)
            singles.push(num);
    }
    return singles.map(x => Number(x));
}

findSingle([1, 3, 3, 6]) 的输出将是:

[1, 6]

注意:这也可以用于字符串,但可能是数字。例如,["1", "3", "3", "6"]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接