JavaScript数组:仅保留存在奇数次数的值,包括

时间:2016-07-06 18:23:14

标签: javascript arrays splice

嘿伙计们,例如我有一个数组:

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]

所以我正在使用拼接:

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

但是当我推动更多的数字时,结果似乎无法预测 如何正确地做到这一点?

澄清:目的是消除重复偶数次的数字。

3 个答案:

答案 0 :(得分:1)

这是另一种方法,它通过在排序后从 lastIndexOf 键中减去 indexOf 键来检查奇数个元素:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用两个reduceObject.keys()执行此操作。首先将值添加到object,然后使用% 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)

答案 2 :(得分:0)

这是ECMAScript2015解决方案:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

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

然后迭代密钥以仅获得具有奇数值(即出现次数)的最终数组中的那些密钥。由于对象属性按数字顺序迭代(数字时),结果会自动按数字排序。

关于您的代码:

你拥有的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]并且不想在那里超出范围。
  • 但更重要的是,在splice循环中执行for会使元素转移位置,然后当您仍然增加index时,您将跳过元素。

简而言之,您不应该在这样的循环中使用splice。你可以通过反方向解决这个问题,然后从阵列末尾开始工作。

但是上面提出的代码没有这个问题,也节省了排序步骤。