Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可能具有未定义属性的数组筛选器_Javascript_Arrays - Fatal编程技术网

Javascript 可能具有未定义属性的数组筛选器

Javascript 可能具有未定义属性的数组筛选器,javascript,arrays,Javascript,Arrays,我有一个对象数组,可以包含属性,也可以不包含属性 因此,为了过滤它,我做了以下操作: array = array.filter(v => v.myproperty != undefined); array = array.filter(v => v.myproperty[0] != undefined); 这将有效地删除myproperty中未定义的元素,然后删除myproperty中第一个元素所在的元素 有没有一种方法可以使用一个线性器来防止我对阵列应用两次过滤器 比如: arr

我有一个对象数组,可以包含属性,也可以不包含属性

因此,为了过滤它,我做了以下操作:

array = array.filter(v => v.myproperty != undefined);
array = array.filter(v => v.myproperty[0] != undefined);
这将有效地删除myproperty中未定义的元素,然后删除myproperty中第一个元素所在的元素

有没有一种方法可以使用一个线性器来防止我对阵列应用两次过滤器

比如:

array = array.filter((v => v.myproperty || [])[0] != undefined);
最后,array.filter接受一个匿名函数,该函数需要一个布尔结果。您可以在内部执行任意数量的工作,以确定是否应筛选数组项

变量数组=[1,2,未定义,3,一些文本,[5,6,7],[undefined,8]] array=array.filterv=>{ 如果!v返回false; 如果v==某些文本返回false; 如果Array.isArrayv&&v.length==0,则返回false; 如果Array.isArrayv&&v[0]==未定义返回false; 返回true; }; console.logarray 那么:

filtered_array = array.filter(element => element.property && element.property[0]);
条件所做的是首先评估左侧部分。如果这是真的,它将尝试评估正确的部分并返回结果


.

语句中可以包含复杂的布尔逻辑

let array = [{num: [1]}, {num: [2]}, {num: [3]}, {num: undefined}, {}]
array = array.filter(v => v && v.num && v.num.length)
arr.filter(e => 'myproperty' in e && 
      Array.isArray(e.myproperty) && 
      e.myproperty[0] !== undefined)
对于可读性和可测试性,您可能希望将其分解为一个可以在其他地方测试的函数

function predicate(v) {
  return v && v.num && v.num.length
}
let array = [{num: [1]}, {num: [2]}, {num: [3]}, {num: undefined}, {}]
array = array.filter(predicate)

您还应该检查properties元素是否为数组。仅使用元素检查属性。字符串的属性[0]也将为true。除此之外,您可以在过滤器中传递任何返回布尔值的内容,就像在if语句中一样

let array = [{num: [1]}, {num: [2]}, {num: [3]}, {num: undefined}, {}]
array = array.filter(v => v && v.num && v.num.length)
arr.filter(e => 'myproperty' in e && 
      Array.isArray(e.myproperty) && 
      e.myproperty[0] !== undefined)

如果第一个条件失败,那么函数将返回

    array => array.filter(v => v.ggwp && v.ggwp[0])
您还可以使用in运算符完成以下相同操作:

    array => array.filter(v => ('myproperty' in v) && (0 in v.myproperty))
下面是一些测试用例,它们将这两个函数与您的函数进行比较

我不确定您是否要使用!=在您的代码中,而不是!==。Javascript,因为类型强制具有

类似于array.filterv=>v.myproperty | |【】[0]!=未定义

是的,正是这样。您只错放了一个括号:

array.filter( v => (v.myproperty || [])[0] != undefined);
//           ^     ^

array=array.filterv=>v.myproperty!=未定义的&v.myproperty[0]!=未定义;工作?不,那将是错误的:myproperty没有定义,因为它试图访问未定义的内容的索引0,但是&&短路,对吗?如果myproperty未定义,则不会计算myproperty[0]。没有问题。但是你可能想再次检查C在这个问题上的行为,因为它肯定也会短路当第一个参数的计算结果为true时,不能在C或javascript中短路。如果说某物为null,而something.property为null,这甚至没有意义。一个更好的例子:-注意没有NPE。