从Javascript数组中删除空元素


1144

如何从JavaScript中的数组中删除空元素?

有没有简单的方法,还是我需要遍历它并手动将其删除?


14
如果您的问题准确指定了“空元素”的含义,这将很有帮助,因为此处的大多数答案均会错误地将其解释为“假”元素。注意:您所获得的var a = [,,]与之间有差异var a = [undefined, undefined]。前者确实是空的,但后者实际上有两个键,但是有undefined值。
Alnitak

Answers:


1063

编辑:大约9年前,当时没有很多有用的内置方法时,就回答了这个问题Array.prototype

现在,当然,我建议您使用该filter方法。

请记住,此方法将为您返回一个新数组,其中的元素可以通过您提供给它的回调函数的条件。

例如,如果要删除nullundefined值:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

例如,这将取决于您认为什么是“空”,如果您正在处理字符串,则上述函数不会删除为空字符串的元素。

我看到经常使用的一种典型模式是除去那些元件falsy,包括一个空字符串""0NaNnullundefined,和false

您可以传递给filter方法,Boolean构造函数或在过滤条件函数中返回相同的元素,例如:

var filtered = array.filter(Boolean);

要么

var filtered = array.filter(function(el) { return el; });

在这两种方式中,这都是可行的,因为filter在第一种情况下,该方法将Boolean构造函数作为一个函数调用,将其转换为值,而在第二种情况下,该filter方法在内部将回调的返回值隐式转换为Boolean

如果您正在使用稀疏数组,并且试图摆脱“空洞”,则可以使用filter传递返回true的回调的方法,例如:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

旧答案:不要这样做!

我使用此方法,扩展了本机Array原型:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

或者,您可以简单地将现有元素推入其他数组:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);

110
警告:第二个选项将删除数组中被视为“虚假”的所有元素,即false,0,null和undefined的值。该数组最终将一无所有:[null ,,,, 0,,0,0,0,false,null,0]即使我可能想要值为0的元素,例如在此数组中:[ 1,0,1,0,0,1]
詹森·邦廷

5
我意识到,这就是为什么我只提到第二种选择。至于第一个,它的范围是如此狭窄,以至于我会毫不犹豫地将其作为Array原型的一部分。有关更理想的信息,请参见此页面上Alnitak的答案。显然,您的确允许链接。
詹森·邦廷

1
如果您无权使用“过滤器”方法,则第一个解决方案将非常好。否则,我相信Alnitak的答案会更好。
Joe Pineda

2
@AlfaTek-除了最新的#2浏览器以外,其他所有浏览器都将具有最佳性能,因为JS中的数组并不是真正的数组。在较旧的浏览器上,此splice调用确实非常昂贵,因为它们必须重新编号所有阵列键以缩小间隔。
Alnitak

1
@David不,在现代代码中,您应该安全地扩展Array.prototype使用,Object.defineProperty以使新函数成为不可枚举的属性,然后避免由于放入.hasOwnProperty每个循环而导致性能下降。
Alnitak

1381

简单方法:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

或-(仅适用于“文本”类型的单个数组项目)

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

或-经典方式:简单迭代

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


通过jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


更新-另一种快速,凉爽的方式(使用ES6):

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;

arr // [1, 2, 3, 3, 4, 4, 5, 6]

删除空值

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]

34
最早的IE支持过滤器是IE9标准模式。
yincrash

14
对于纯JavaScript,应该是arr = arr.filter(function(n){return n; });
ilumin

19
foo.join("").split("")仅在字符串为单个字符
时才起作用

8
您的纯JavaScript代码存在错误。如果数组中的值带有“ 0”,则该值将被滤除,因为“ 0”是虚假的。您想要的是:arr.filter(function(n){return(n!== undefined && n!== null);});
John Kurlak 2014年

5
ES6可以做到这一点更简单arr.filter(e=>e),这可以通过地图进行链接,减少等等
Sheepy

241

如果您需要删除所有空值(“”,null,undefined和0):

arr = arr.filter(function(e){return e}); 

要删除空值和换行符:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

例:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

返回:

["hello", 1, 100, " "]

更新(基于Alnitak的评论)

在某些情况下,您可能希望在数组中保留“ 0”并删除其他任何内容(null,undefined和“”),这是一种方法:

arr.filter(function(e){ return e === 0 || e });

返回:

["hello", 0, 1, 100, " "]

是的,这很好,因为也删除了“”。
Vladimirs

3
测试功能可能更明确:function(e){return !!e}
Koen。

4
@Koen请注意,其中!!e将包含NaN(与0不同),e而不会包含(如0)。
羊皮的

实际上并没有回答所提出的问题。
Alnitak

2
或使用use var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);删除未定义的“”“和0
Mark Schultheiss

134

只需一根衬垫:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

或使用underscorejs.org

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

1
这真的很酷-虽然我有一个newb问题:看来您正在使用类名作为函数调用-那是类型转换吗?我以前从未见过这种情况,也不确定我为什么要传递Boolean函数作为函数……
Andrew

8
如果您将其Boolean视为一个函数,它将简单地返回true或返回false真/假值。
andlrc

8
您没有布尔值视为函数;而是布尔值视为函数。这一个功能。(一个完全正常的功能,只是它是本地实现的。)有人需要对JavaScript对象模型进行一些研究。;)
ELLIOTTCABLE

@ELLIOTTCABLE我要把这个留在这里(true).constructor === Boolean。然后告诉我是否可以使用JS中的其他内置插件来做到这一点。;))(当然不包括其他5个内置构造函数。(String,Array,Object,Function,Number))
andlrc

1
如果数组中的值为0,则两者都会失败
Sai Ram

129

如果您具有Javascript 1.6或更高版本,则可以使用Array.filter简单的return true回调函数来使用,例如:

arr = arr.filter(function() { return true; });

因为会.filter自动跳过原始数组中缺少的元素。

上面链接的MDN页面还包含一个不错的错误检查版本,filter该版本可以在不支持正式版本的JavaScript解释器中使用。

请注意,这不会删除null条目或具有显式undefined值的条目,但是OP会特别要求“丢失”的条目。


你是对的!它可以如此简单(并且可以工作!):test3 = [1,2,,3,,3 ,,,, 7,,7 ,,, 0 ,,,, 4,,4,,5 ,, 6,,undefined ,, null ,,]; printp(“使用数组的本机过滤:”,test3.filter(function(value){return(value == undefined)?0:1;})));
Joe Pineda

3
+1如Alnitak所说,他们拥有可以在没有js 1.6的情况下使用的代码
Sameer Alibhai 2010年

3
@katsh我已经澄清了-上面的代码确实可以删除根本不存在任何值的条目,(后来我了解到)这些条目在语义上不同于存在但具有undefined给定值的键的情况。
Alnitak

4
要删除未定义的或空的条目,只需进行一些小的修改即可... arr = arr.filter(function(v){return v;});
艾伦·

4
@AlanCN,您完全错过了我的观点。OP要求删除丢失的条目,而此处的大部分答案(错误地)删除了所有“假”条目。
Alnitak

65

要去除孔,应使用

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

为了消除空洞,以及虚假(空,未定义,0,-0,NaN,“”,false,document.all)值:

arr.filter(x => x)

要删除空,空和未定义的孔:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]


3
答案应该很高。你能扩大你所说的孔/孔的意思吗?
samayo

2
@samayo孔是未填充的阵列项,即[, ,]
Jimmy Obonyo Abor

通过使用arr.filter(x => x),JS将检查x是真实还是虚假,即if (x),因此,只有真实值将分配给新列表。
关羽初

56

做到这一点的干净方法。

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]

5
空元素是undefined; 这基本上消除了所有虚假的值。
pimvdb 2011年

33

简单的ES6

['a','b','',,,'w','b'].filter(v => v);

1
这不起作用:[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
拉链

22

使用下划线/ Lodash:

一般用例:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

带空:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

参见lodash文档了解没有


#compact的问题在于它删除了任何虚假值。因此,如果您的数组包含0个值,它们也将被删除。
塞缪尔·布兰多

21

只是ES6较新的版本方法,假设数组如下:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

简单方法:

 const clearArray = arr.filter( i => i );

16

如果使用库是一种选择,我知道underscore.js具有一个称为compact()的函数http://documentcloud.github.com/underscore/,它还具有其他一些与数组和集合相关的有用函数。

这是他们文档的摘录:

_.compact(array)

返回删除了所有伪造值的数组的副本。在JavaScript中,false,null,0,“”,undefined和NaN都是虚假的。

_.compact([0,1,false,2,'',3]);

=> [1、2、3]


它也消除了非空元素定义的元素等0
蒂莫西谷

15

@Alnitak

实际上,如果添加一些额外的代码,Array.filter可以在所有浏览器上运行。见下文。

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

这是您需要为IE添加的代码,但imo和过滤器和函数式编程值得。

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}

这是可以接受的答案,因为它开箱即用。非常感谢。
托尼

@Tony不,不应该,因为其中包含空字符串的元素与“空元素”不同,后者是OP要求的。
Alnitak

14

由于没有人提及它,并且大多数人的项目中都包含下划线,因此您也可以使用_.without(array, *values);

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]


8

您可能会发现,要遍历数组并从要保留在数组中的项中构建新数组比尝试像建议的那样进行遍历和拼接要容易得多,因为修改数组的长度是在遍历数组时过度会带来问题。

您可以执行以下操作:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

实际上,这是一个更通用的解决方案:

function removeElementsFromArray(someArray, filter) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(filter(someArray[index]) == false) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

// then provide one or more filter functions that will 
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
    return (item == null || typeof(item) == "undefined");
}

// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);

// results == [1,2,3,3,4,4,5,6]

您知道了-然后可以使用其他类型的过滤器功能。可能超出您的需要,但我感到很慷慨...;)


7

那么这件事(ES6):从数组中删除Falsy值。

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]


3

我简单地增加我的声音上面的“呼叫ES5的Array..filter()具有全球构造”高尔夫黑客,但我建议使用Object,而不是StringBooleanNumber以上的建议。

具体来说,ES5 filter()尚未触发undefined数组中的元素;因此,不会触发ES5 。这样一个功能,普遍返回true,返回所有元素filter()命中,必然只返回非undefined要素:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

但是,写出来...(function(){return true;})比写更长...(Object)Object任何情况下,构造函数的返回值都是某种对象。与上面建议的原始装箱构造函数不同,没有可能的object-value为false,因此在boolean设置中,它Object是的简写function(){return true}

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

1
注意:filter(String)和filter(Object)不会滤除null或数字。由于构造函数也是函数,因此您可以将String传递给filter,即someArray.filter(String);实际上等于someArray.filter(function(x){ return String(x); });。如果要删除所有伪造的值,则someArray.filter(Boolean);可以删除0,-0,NaN,false,'',null和undefined。
robocat

1
很好的答案,尽管我想知道调用Object构造函数(而不是return true方法)的性能开销。@robocat OP要求删除空元素,而不是null。
Alnitak

除了紧密循环外,我更喜欢最短,最清晰的解决方案。我想是个人喜好。(=
ELLIOTTCABLE

3

当使用上面投票最高的答案时,第一个示例是,我得到的字符串长度大于1的单个字符。下面是我针对该问题的解决方案。

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

如果长度大于0,我们将返回而不是返回未定义的字符串。希望可以帮助到那里的人。

退货

["some string yay", "Other string yay"]

+1是非常实用的,这正是我通常需要处理的字符串数组,但是要注意,这会删除数字(如果它们不是字符串形式),因为它们没有.lenghth,因此["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123请替换该函数。具有讽刺意味的是,..与String一起使用时,会留下数字,但在给定的数组中会得到相同的结果。
aamarks

3
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]


这显然是正确的方法,应该放在首位!
马丁·安德森


1

可行,我在AppJet中对其进行了测试(您可以将代码复制粘贴到其IDE上,然后按“重新加载”以查看其工作原理,无需创建帐户)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/

1
这似乎只是“偶然”地起作用,因为通过枚举键的行为for ... in实际上导致跳过丢失的元素。测试undefined仅用于删除显式设置为该值的真实元素。
Alnitak

1

另一种方法是利用数组的length属性:将非null项包装在数组的“左侧”,然后减小长度。它是一种就地算法-不分配内存,对于垃圾回收器来说太糟糕了-并且它具有最佳/平均/最坏情况的良好行为。

与此处的其他解决方案相比,此解决方案在Chrome上快2到50倍,在Firefox上快5到50倍,您可能会在这里看到:http : //jsperf.com/remove-null-items-from-array

下面的代码将不可枚举的'removeNull'方法添加到Array,该方法以菊花链形式返回'this':

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;

很好的答案,尽管最好查看一些测试用例以展示其实际效果!
Alnitak

2
这个答案非常有趣,但是让我想起了当我拥有智能手机时看一台1945年制造的计算机:arr.filter(e => e)
agm1984年

1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

退货

[0, 1, 2, 3, "four"]

1

在(对象成员)循环中“滥用” for...。=>循环主体中仅显示真实值。

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);

代码正确,注释错误。使用的行为for ... in是从数组中删除未定义键的原因,但实际上您这里没有任何代码可以接受“真实的”值
Alnitak

1

这可能对您有帮助:https : //lodash.com/docs/4.17.4#remove

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };

1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

输出:

我正在开发nodejs

它将从数组中删除空元素并显示其他元素。


输出:“我正在使用nodejs”。它将从数组中删除空元素并显示其他元素。
Jitendra virani '18

我改善了你的答案。请尝试做出简单,清晰和可读的答案;)
GGO,

1

删除所有空元素

如果数组包含空的Objects,Arrays和Strings以及其他空元素,则可以使用以下方法将其删除:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

简单压缩(从数组中删除空元素)

使用ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

用普通的Javascript->

var arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)


0

使用正则表达式过滤掉无效条目

array = array.filter(/\w/);
filter + regexp

这样行吗?它显示错误TypeError:[object RegExp]不是函数
FreeLightman

0

删除空元素的最佳方法是使用Array.prototype.filter(),如其他答案中所述。

不幸的是,Array.prototype.filter()IE <9不支持。如果仍然需要支持IE8或更高版本的IE,则可以使用以下polyfill添加对Array.prototype.filter()这些浏览器的支持:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.