过滤掉对象中未定义的属性

时间:2019-09-18 13:49:55

标签: javascript arrays filter

我有一个由对象组成的数组。这是一个示例:

[
{events: Array(5), conditions: {…}},
{events: Array(5), conditions: {…}}
{conditions: {…}, awaits: Array(0), events: Array(1), pid: "123"}
] 

您看到的对象有所不同。有些具有“ pid”属性,有些则没有。那就是这个问题的全部内容。

我想将带有pid的对象分配给包含pid的对象的新数组。

可以说此数组存储在match.entries中。好吧,这就是我尝试过的。

// aa = match.entries.filter(entry => {return typeof entry.pid !== 'undefined'})

这似乎不起作用。

我的整个代码:

    let aa = [];

   conditionalMatches.forEach(match => {
      aa = match.entries.filter(entry => {return typeof entry.pid !== 'undefined'})
    });

返回空数组。

2 个答案:

答案 0 :(得分:1)

只需使用array.filter((arrayItem) => arrayItem.pid)即可使用null值。而且,由于pid是字符串类型,因此它将值视为0,但是将跳过空值,而将其视为""

const conditionalMatches = [
  [{
      events: Array(5),
      conditions: {}
    },
    {
      events: Array(5),
      conditions: {}
    },
    {
      conditions: {},
      awaits: Array(0),
      events: Array(1),
      pid: ""
    },
    {
      conditions: {},
      awaits: Array(0),
      events: Array(1),
      pid: "123"
    }
  ],
  [{
      events: Array(5),
      conditions: {}
    },
    {
      conditions: {},
      awaits: Array(0),
      events: Array(1),
      pid: "123"
    }
  ],
  []
];


let aa = [];

conditionalMatches.forEach(match => {
  let filterArr = match.filter((arrayItem) => arrayItem.pid);
  if(filterArr.length !== 0) {
   aa.push(filterArr);
  }
});

console.log(aa);

答案 1 :(得分:0)

您应该能够使用Array.filter查找定义了pid的对象

conditionalMatches.forEach(match => {
  match.entries.forEach(entry => {
    if(entry.pid){
       aa.push(entry);
    }
  })
});

根据下面的评论,这确实必须在for循环中发生,您可以做更多类似的事情吗?

data(World)
tm_shape(World) +
tm_fill("well_being", id="name", title="Well-being") +
tm_format("World") +
tm_credits("SOME CREDITS HERE", position=c("left", "bottom"))