嘿伙计们,例如我有一个数组:
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];
}
}
但是当我推动更多的数字时,结果似乎无法预测 如何正确地做到这一点?
澄清:目的是消除重复偶数次的数字。
答案 0 :(得分:1)
这是另一种方法,它通过在排序后从 lastIndexOf 键中减去 indexOf 键来检查奇数个元素:
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;
答案 1 :(得分:0)
您可以使用两个reduce
和Object.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解决方案:
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;
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
。你可以通过反方向解决这个问题,然后从阵列末尾开始工作。
但是上面提出的代码没有这个问题,也节省了排序步骤。