跳过Javascript array.filter()元素

时间:2018-01-21 22:21:04

标签: javascript arrays arguments

我试图删除给定参数中的常见元素 创建具有唯一元素的最终数组。 在下面的例子中,我的最后一个数组给了我[1,3,4,5]而不是[1,4,5]。   我做了调试,而元素(3)之一没有经过循环。 在元素(2)之后,它跳到元素(4)。我很困惑为什么会这样?我的代码有什么问题吗?任何帮助赞赏。 谢谢

  function arrayBreaker(arr) {
  let test = [];
  test.push(arguments[1]);
  test.push(arguments[2]);
  let target = arguments[0];

  target.filter(val => {
  if (test.indexOf(val) > -1) {
  target.splice(target.indexOf(val), 1);
  }
 });
  return target;
 }

console.log(arrayBreaker([1,2,3,4,5], 2, 3));

2 个答案:

答案 0 :(得分:0)

你正在使用.filter()像一个通用迭代器,并改变你正在迭代的数组,这会导致问题,因为迭代器不知道你要删除的项目。

如果您需要改变原始数组,而是从.indexOf()回调中返回.filter()操作的结果,或者更好的是,请改用.includes(),然后复制结果在第一次清除它之后进入原始版本。

function arrayBreaker(target, ...test) {
  const res = target.filter(val => !test.includes(val));
  target.length = 0;
  target.push(...res);
  return target;
}

console.log(arrayBreaker([1, 2, 3, 4, 5], 2, 3));

如果您不需要变异,但可以返回副本,那么它就更简单了。

function arrayBreaker(target, ...test) {
  return target.filter(val => !test.includes(val));
}

console.log(arrayBreaker([1, 2, 3, 4, 5], 2, 3));

答案 1 :(得分:0)

Array正在根据过滤条件返回一个新数组,在这种情况下,您正在检查test的索引。如果要保留值,则回调函数期望为true,否则返回false。在你的情况下,你不应该在过滤器回调中切割目标,而是:

library(meta)
library(metafor)

m1 <- metaprop(obs, denom, studies, comb.random=F, byvar=setting, 
               bylab="Setting", byseparator=": ")
m2 <- metaprop(obs, denom, studies, comb.random=F, byvar=setting, 
               bylab="Setting", byseparator=": ", method="GLMM")
m2$w.fixed <- m1$w.fixed

forest(m2, print.tau2 = FALSE, col.by="black", text.fixed = "Total",
       text.fixed.w = "Subtotal", rightcols = c("effect","ci"), 
       leftlabs=c("Study","Intubated","Total"))

有关数组过滤器的更多信息,请在此处查看文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

根据您的使用案例,我认为很少有些事情会有所帮助,首先我会声明函数参数,以便明确说明arrayBreaker需要多个参数。其次,我希望第二个参数作为一个数组,因为我们期待多个值。如下所示:

function arrayBreaker(arr) {
  let test = [];
  test.push(arguments[1]);
  test.push(arguments[2]);
  let target = arguments[0];

  let newArray = target.filter(val => {
    if (test.indexOf(val) > -1) {
      // filter value out
      return false;
    }
    // keep the val inside new array
    return true;
  });
  return newArray;
}
console.log(arrayBreaker([1,2,3,4,5], 2, 3));