在Javascript中只包含数组中的奇数元素

时间:2017-04-09 09:37:39

标签: javascript

不确定为什么这段代码不起作用编辑*它应该只返回数组中的奇数元素

function findOdd(A) {
  var arr = [];

  for (var i=0; i<A.length; i++){
    if(arr.indexOf(A[i]) == -1){
      arr.push(A[i]);
    }
    else {
      arr.splice(A[i],1);
    }
  } 
  return arr;
}

对于测试用例,findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])应该返回但是它返回[20,-1,3,5]。任何想法为什么这不起作用,因为我认为它应该?谢谢。

2 个答案:

答案 0 :(得分:0)

您只需更改此行

即可
arr.splice(A[i],1);

arr.splice(arr.indexOf(A[i]),1); //remove it from index of this element since splice is taking index rather than element itself.

<强>样本

function findOdd(A) {
  var arr = [];

  for (var i=0; i<A.length; i++){
    if(arr.indexOf(A[i]) == -1){
      arr.push(A[i]);
    }
    else {
      arr.splice(arr.indexOf(A[i]),1);
    }
  } 
  return arr;
};

var output = findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5]);
console.log( output );

答案 1 :(得分:0)

您也可以按照以下方式非常有效地完成工作;

在这种特殊情况下,hash生成的.reduce()对象看起来像

{ odd : { '1': 0, '2': 0, '3': 0, '4': 0, '5': 3, '20': 0, '-1': 0, '-2': 0 },
  even: { '1': 2, '2': 2, '3': 2, '4': 2, '5': 0, '20': 2, '-1': 2, '-2': 2 } }

Object.keys()部分从hash.odd子对象收集所需信息。

function oddMany(a){
  var hash = a.reduce((h,n) => h.odd[n] ? (h.even[n] = h.odd[n] + 1, h.odd[n] = 0, h)
                                        : (h.odd[n] = h.even[n] + 1 || 1, h.even[n] = 0, h), {odd:{},even:{}});
  return Object.keys(hash.odd).reduce((r,k) => hash.odd[k] ? r.concat(k) : r ,[]);
}

var arr = [20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5];

console.log(oddMany(arr));