在每个

时间:2018-05-08 15:02:35

标签: javascript

我正在尝试根据对象的特定属性是否为null来过滤掉对象数组中的数据点。但是,此数组嵌套在另一个数组中。请参阅下面的示例(我想从'b'数组中删除那些在'c'属性中包含 null 的对象:

var data = [{
  a: 1,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }]
}, {
  a: 2,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }, {
    c: 13,
    d: 1
  }]
}, {
  a: 6,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }, {
    c: null,
    d: 10
  }]
}]

data.forEach(function(d) {
  d['b'].filter(function(da) {
    return typeof(da['c']) == "number"
  })
})

console.log(data)

上面的代码不是从嵌套数组中删除“null”值对象,而是按原样返回整个数组。我在这做错了什么?

更新:我理解了我的错误,并且我已经用答案更新了帖子。感谢所有回复。

5 个答案:

答案 0 :(得分:1)

data.forEach((dataPoint) => {
  dataPoint.b = dataPoint.b.filter((dataChild) => {
    return typeof dataChild.c === 'number'
  })
})

您只需将“b”重新分配给新过滤的数组。

答案 1 :(得分:1)

您可以使用reduce功能

尝试使用代码



var data = [{
  a: 1,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 20
  }]
}, {
  a: 2,
  b: [{
    c: null,
    d: 10
  }, {
    c: 30,
    d: 40
  }, {
    c: 13,
    d: 1
  }]
}, {
  a: 6,
  b: [{
    c: null,
    d: 10
  }, {
    c: 50,
    d: 60
  }, {
    c: null,
    d: 10
  }]
}];
var result = data.reduce((r,s) => {
  r.push(Object.assign({}, s, {b: s.b.filter(v => v.c)}));
return r;
}, []);

console.log(result);




答案 2 :(得分:1)

data = data.map(value => ({...value, b: value.b.filter(innerValue => typeof innerValue.c === 'number')}))

这里是working fiddle.

答案 3 :(得分:0)

这对你有用吗?

data.map(item => ({ ...item, b: item.b.filter(itemB => itemB.c)}))

data.map(item => ({ a: item.a, b: item.b.filter(itemB => itemB.c)}))

输出:

[
  {
    "a": 1,
    "b": [
      {
        "c": 10,
        "d": 10
      }
    ]
  },
  {
    "a": 2,
    "b": [
      {
        "c": 10,
        "d": 10
      },
      {
        "c": 13,
        "d": 1
      }
    ]
  },
  {
    "a": 6,
    "b": [
      {
        "c": 10,
        "d": 10
      }
    ]
  }
]

答案 4 :(得分:0)

非常感谢所有答案。我理解我的错误。我没有将.filter()的返回值赋给任何东西。这是更新后的代码



data1 = [{
  a: 1,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }]
}, {
  a: 2,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }, {
    c: 13,
    d: 1
  }]
}, {
  a: 6,
  b: [{
    c: null,
    d: 10
  }, {
    c: 10,
    d: 10
  }, {
    c: null,
    d: 10
  }]
}]

data1.forEach(function(d) {
  d['b'] = d['b'].filter(function(da) {
    return typeof da['c'] === "number"
  })
})

console.log(data1)