JavaScript 数组:仅保留出现奇数次的值,包括出现一次的值

3

嗨,大家好,例如我有一个数组:

myArray[5,4,1,2,1,4,5,6,7,8,9,10,1,2,1,5,3,2]

我正在对该数组进行排序:

[1, 1, 1, 1, 10, 2, 2, 2, 3, 4, 4, 5, 5, 5, 6, 7, 8, 9]

我希望你只删除其中的两个重复项,以便得到所需的数组。
[10,2,3,5,6,7,8,9]

我正在使用splice:

for (var index = 0; index < myArray.length +1; ++myArray) {
  if(myArray[index+1]== myArray[index]) {
    myArray.splice(index);
    myArray.splice[index+1];
  }
}

但是当我处理更多数字时,结果似乎变得不可预测。如何正确做到这一点?

澄清一下:目的是消除重复出现偶数次的数字。


3
你希望输出中出现数字1吗? - danh
3
您正在遍历数组时修改它,这可能会导致一些不可预测的行为。建议使用 filter 来代替。 - Hamms
2
ES6 的一行代码 Array.from(new Set(myArray)); - Jared Smith
2
你的标题中的模数是在哪里用到的? - TecBrat
1
你想要所有出现奇数次的值,包括只出现一次的吗? - TecBrat
显示剩余12条评论
3个回答

2

以下是另一种方法,通过排序后将键的indexOf减去键的lastIndexOf来检查元素数是否为奇数:

var myArray = [5,4,1,2,1,4,5,6,7,8,9,10,1,2,1,5,3,2];

var result = myArray.sort().filter(function(key, idx) {
  return myArray.indexOf(key) === idx && //handle first instance only
         (myArray.lastIndexOf(key) - myArray.indexOf(key)) % 2 === 0;
});

console.log(result);


0
你可以使用两个函数reduceObject.keys()来实现这个功能。首先将值添加到对象中,然后检查每个值是否为% 2,并将其添加到数组中。

var myArray = [5,4,1,2,1,4,5,6,7,8,9,10,1,2,1,5,3,2];
var obj = myArray.reduce(function(o, e) {
  o[e] = (o[e] || 0)+1;
  return o;
}, {})

var result = Object.keys(obj).reduce(function(r, e) {
  if(obj[e] % 2) r.push(Number(e));
  return r;
}, []);

console.log(result)


非常好的解决方案,现在我知道如何解决这样的问题了,谢谢您。 - Rafalsonn

0

这里是一个 ECMAScript2015 的解决方案:

var myArray = [5,4,1,2,1,4,5,6,7,8,9,10,1,2,1,5,3,2];
var count = myArray.reduce((count, num) => 
                           (count[num] = (count[num] || 0) + 1, count), {});
myArray = Object.keys(count).filter(num => count[num] % 2).map(Number);
console.log(myArray);

计数变量是一个对象,其属性是原始数组中的数字。每个属性的值是原始数组中该数字出现的次数。

然后迭代这些键,只将那些具有奇数值(即出现次数)的键放入最终数组中。由于对象属性在按数字顺序迭代时自动按数字排序,因此结果会自动按数字排序。

关于您的代码:

您的for循环存在一些问题:

for (var index = 0; index < myArray.length +1; ++myArray) {
  if(myArray[index+1]== myArray[index]) {
    myArray.splice(index);
    myArray.splice[index+1];
  }
}
  • 你肯定不想增加myArray,而是要增加index
  • 边界条件不应该是length+1,而是length-1,因为在循环体中你有myArray[index+1],不想越界。
  • 更重要的是,在for循环中使用splice会使元素位置发生变化,然后你仍然增加index,就会跳过元素。

简而言之,在这样的循环中不应该使用splice。你可以通过反向遍历数组并从末尾开始向前工作来解决这个问题。

但上面提出的代码没有这个问题,还可以省去排序步骤。


它正在运行,我现在看到了。我的代码中有很多错误,谢谢你。 - Rafalsonn

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