Javascript - 仅使用pop()方法删除数组中的负值

时间:2015-02-22 00:41:23

标签: javascript arrays

我试图仅使用Javascript中的pop()方法删除此数组中的负数。我知道pop()会删除最后一项,那么如何使用pop()删除此数组中的两个负数?谢谢!

var x = [-3,5,1,3,2,10,-7];
for (var i = x.length-1; i >= 0; i--){
  if (x[i] < 0){
    x.pop(x[i]);
  }
}
console.log(x)

5 个答案:

答案 0 :(得分:2)

我发现这只是一个相当愚蠢的问题,只能使用.pop()。它闻起来像家庭作业,并不是一个现实世界的问题。


好了,现在已经公开了实际规则(仅使用.pop()来删除值而没有临时数组),这里的方法只使用.pop()从数组中删除值。它假定不需要保留原始顺序(尽管可以使用更多代码完成)。这在数组中向后工作,只要它找到负值,它会将该值与数组中的最后一个值交换,然后.pop()关闭该负值:

var x = [-3,5,1,3,2,10,-7], temp;
for (var i = x.length - 1; i >= 0; i--) {
    if (x[i] < 0) {
        if (i !== x.length - 1) {
            // swap current value with last value
            temp = x[i];
            x[i] = x[x.length - 1];
            x[x.length - 1] = temp;
        }
        x.pop();
    }
}

工作演示:http://jsfiddle.net/jfriend00/wo8fhoor/


而且,这是一个保留数组顺序的版本,同时仅使用.pop()从数组中删除项目。当它找到负值时,它会复制数组中的所有后续项(从而将其删除),然后使用.pop()将数组缩短一个:

var x = [-3,5,1,3,2,10,-7];
for (var i = 0; i < x.length; i++) {
    if (x[i] < 0) {
        removeItem(x, i);
    }
}
log(x);

function removeItem(array, index) {
    for (var i = index; i < array.length - 1; i++) {
        array[i] = array[i + 1];
    }
    array.pop();
}

工作演示:http://jsfiddle.net/jfriend00/uvqx6hq0/


这些版本的代码是在披露完整规则之前发布的

你可以遍历数组,每次弹出最后一项,然后构建一个只包含你喜欢的值的新数组:

var x = [-3,5,1,3,2,10,-7];
var y = [];
while (x.length) {
    var val = x.pop();
    if (val >= 0) {
        y[y.length] = val;
    }
}
x = y.reverse();

工作演示:http://jsfiddle.net/jfriend00/2atz6ck9/

.pop()仅删除数组中的最后一项。删除该特定项目不需要参数,因此您无法使用它来删除数组中的第n个项目。


在现实世界中,您可以使用.filter()生成新数组,也可以使用.splice()删除单个元素。

这是一个.splice()解决方案:

var x = [-3,5,1,3,2,10,-7];
for (var i = x.length-1; i >= 0; i--){
  if (x[i] < 0){
    x.splice(i, 1);
  }
}
console.log(x)

工作演示:http://jsfiddle.net/jfriend00/gqt5avLb/


而且,这是使用.filter()的解决方案:

var y = x.filter(function(val) {
     return val >= 0;
});

或者,在ES6中:

let y = x.filter(val => val >= 0);

答案 1 :(得分:0)

您可以使用filter功能实现您想要的功能。

var positiveNumbers = x.filter(function(number){ 
       return number>=0;
})

&#13;
&#13;
var x = [-3,5,1,3,2,10,-7];

var positiveNumbers = x.filter(function(number){ 
       return number>=0;
});

document.write(positiveNumbers);
&#13;
&#13;
&#13;

使用您尝试的pop方法是不可能的。根据{{​​3}}:

  

pop()方法从数组中删除最后一个元素并返回   那个元素。

此外,您无法同时尝试迭代数组元素并从此数组中删除元素。它没有意义。您可以过滤数组的元素,可以删除特定元素,也可以向数组中添加元素,但是您可以定义循环遍历它的元素,同时从中删除元素。

答案 2 :(得分:0)

也许您可以使用2D数组。

var x = [1, -2, 3]; //Your basic array
var x1 = [[1, -2, 3], [-2, 3, 1] ,[3, 1, -2]];
//Perhaps put this into a function?
for (var i = 0; i < x1.length; i++) {
  if (x1[i][x1.length] < 0) {
    x1[i].pop();
    return x1[i];
  }
}

这绝不是一个有效的解决方案,但如果你的元素数量很少就应该没问题。

修改

这是一个用于创建2D数组的函数:

var createArray = function() {
  var x = [1, -2, 3]; //Your array here
  var x1 = []; //The 2D array
  for (var i = 0; i < x.length; i++) {
    x1[i] = []; //Makes the 2D array
  }
  x1[0] = x; //The first array
  for (var i = 0; i < x1.length; i++) {
    var last = x1[i].pop(); //Finds the last element
    x1[i+1][0] = last;
    for (var j = 0; j < x1[i].length; j++) {
      x1[i][j] = x1[i+1][j+1];
    }
  }
  return x1;
}

答案 3 :(得分:0)

试试这个:

var x = [-3,5,1,3,2,10,-7];
var arr = x.map(function(item, index) {
    return [item, index]; // Add indices
});
arr.sort(function(a, b) {
    return b[0] - a[0];   // Sort by value
});
while(arr[arr.length-1][0] < 0)
    arr.pop();            // Pop negatives
arr.sort(function(a, b) {
    return a[1] - b[1];   // Undo sort
});
arr.map(function(item) {
    return item[0];       // Remove indices
});

当然,这不是消除否定的好方法。

答案 4 :(得分:0)

这个,尽管我之前的评论可能是pop(),但它需要创建另一个数组,同时迭代现有数组:

&#13;
&#13;
function ridiculousApproach(arr) {
  if (!arr) {
    return false;
  }
  var temp = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    temp.push(arr[i]);
    if (arr[i] < 0) {
      temp.pop();
    }
  }
  return temp;
}

var x = [-3, 5, 1, 3, 2, 10, -7];

console.log(x, ridiculousApproach(x));
&#13;
&#13;
&#13;

这是荒谬的,因为首先不将负数添加到temp数组会更容易,也更明智:

&#13;
&#13;
function ridiculousApproach(arr) {
  if (!arr) {
    return false;
  }
  var temp = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    if (arr[i] > -1) {
      temp.push(arr[i]);
    }
  }
  return temp;
}

var x = [-3, 5, 1, 3, 2, 10, -7];

console.log(x, ridiculousApproach(x));
&#13;
&#13;
&#13;