如何从数组中删除对象,如果对象中不存在属性

7
我有以下数据集合。
[{
 id: '1',
 date: '2017-01-01',
 value: 2
 },
 {
 id: '2',
 date: '2017-01-02',
 value: 3
 },
 {
 id: '3',
 value: 3
 },
 id: '4',
 date: '2017-01-02',
 value: 3
 }]

我希望删除任何没有“日期”属性的对象。在上面的例子中,id为3的对象应被删除。

最终的对象应该长这样

[{
 id: '1',
 date: '2017-01-01',
 value: 2
 },
 {
 id: '2',
 date: '2017-01-02',
 value: 3
 },
 id: '4',
 date: '2017-01-02',
 value: 3
 }]

我尝试使用lodash查找和删除undefined值,但无效。该对象看起来与输入的完全相同。

  _.each(obj, (val) => {
    _.remove(val, value => value['XXX-BUDAT'] === undefined);
   });

我该如何使用lodash来实现这个目的呢?谢谢提前帮助。
6个回答

5
你可以使用 .filter()Object.keys().includes()

let input = [
   { id: '1', date: '2017-01-01', value: 2},
   { id: '2', date: '2017-01-02', value: 3},
   { id: '3', value: 3 },
   { id: '4', date: '2017-01-02', value: 3 }
]
 
 let output = input.filter(obj => Object.keys(obj).includes("date"));
 
 console.log(output);


啊,好的。你可以创建一个包含日期键的对象,而不是删除它。谢谢你,Mickl。 - Ckappo
如果这对您有用,请为未来的读者点赞此问题,并考虑接受它,如果您认为它是最好的答案。 - lealceldeiro
@mickl,使用Object.hasOwnProperty可能更有意义,不是吗?这样你就不必生成+迭代对象键集合了。 - Marie

4
你可以按照以下方式基于该属性筛选数组:

使用filter方法:

const initial = [{
    id: '1',
    date: '2017-01-01',
    value: 2
  },
  {
    id: '2',
    date: '2017-01-02',
    value: 3
  },
  {
    id: '3',
    value: 3
  }, { // this left curly brace was missing!, check that out
    id: '4',
    date: '2017-01-02',
    value: 3
  }
];

const finalR = initial.filter((obj) => obj.hasOwnProperty('date') && !!obj.date);

console.log(finalR);


请注意,这可能会导致问题,因为它也会查找原型链。 - ibrahim mahrir
我不知道为什么我的先前评论被删除了... 无论如何,答案在_ibrahim mahrir_的评论后已更新。 - lealceldeiro

3
您可以使用Array#filterObject#hasOwnProperty来实现此操作:
var newArray = oldArray.filter(function(obj) {
    return obj.hasOwnProperty("date");
});

使用箭头函数可以缩短代码:

var newArray = oldArray.filter(obj => obj.hasOwnProperty("date"));

Lodash解决方案:

var newArray = _.filter(oldArray, obj => _.has(obj, "date"));

示例:

var oldArray = [{id: '1', date: '2017-01-01', value: 2 }, { id: '2', date: '2017-01-02', value: 3 }, { id: '3', value: 3 }, {id: '4', date: '2017-01-02', value: 3}];

var newArray = oldArray.filter(obj => obj.hasOwnProperty("date"));

console.log(newArray);


1
你可以使用 Array.prototype.filter。此外,你还可以使用ES6对象分配解构来使其更简洁:
var data=[{id:'1',date:'2017-01-01',value:2},{id:'2',date:'2017-01-02',value:3},{id:'3',value:3},{id:'4',date:'2017-01-02',value:3}];

var result = data.filter(({date}) => date);

console.log(result)

0
首先,你的对象数组无效,请通过在前面加上大括号{来修复它的最后一个对象元素。请参见Array.prototype.filter()Object.prototype.hasOwnProperty(),它们将检查当前对象项是否具有date键?如果有,则返回该对象,否则该项将不会返回。

var array_of_object = [{
    id: '1',
    date: '2017-01-01',
    value: 2
  },
  {
    id: '2',
    date: '2017-01-02',
    value: 3
  },
  {
    id: '3',
    value: 3
  },
  { //missing brace here
    id: '4',
    date: '2017-01-02',
    value: 3
  }
];


function filterByValue(item) {
  return item.hasOwnProperty('date');
}
var arrByID = array_of_object.filter(filterByValue);
console.log(arrByID);


0

这是一个本地JavaScript解决方案:

var arr = [
  {id: '1', date: '2017-01-01', value: 2},
  {id: '2', date: '2017-01-02', value: 3},
  {id: '3', value: 3},
  {id: '4', date: '2017-01-02', value: 3}
]

for(var i = 0; i < arr.length; i++) {
  if(!arr[i].hasOwnProperty("date")) {
    arr.splice(i,1);
  }
}

console.log(arr);


请注意,这可能会导致问题,因为它也会查找原型链。请参见此评论;在我第一次尝试回答问题时,我也省略了这个问题 :) 一个解决方案是使用hasOwnProperty函数。 - lealceldeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接