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

时间:2018-07-16 17:52:58

标签: javascript arrays lodash

我有以下数据收集

[{
 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
 }]

我想删除任何不具有'date'属性的对象。在上面的示例中,应删除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查找和删除一个未定义的值。这是行不通的。该对象看上去与输入时完全一样。

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

如何为此目的使用lodash?

预先感谢

6 个答案:

答案 0 :(得分:2)

您可以使用.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);

答案 1 :(得分:2)

您可以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);

答案 2 :(得分:2)

您可以使用public static byte[] GenerateSalt() { using (var randomNumberGenerator = new RNGCryptoServiceProvider()) { var salt = new byte[32]; randomNumberGenerator.GetBytes(salt); return salt; } } public static byte[] HashPassword(byte[] password, byte[] salt, int iterations) { using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, iterations)) { return rfc2898.GetBytes(32); } } public static bool CompareByteArrays(byte[] array1, byte[] array2) { if (array1.Length != array2.Length) { return false; } for (int i = 0; i < array1.Length; i++) { if (array1[i] != array2[i]) { return false; } } return true; } Array#filter来这样做:

Object#hasOwnProperty

可以使用箭头功能将其缩短:

var newArray = oldArray.filter(function(obj) {
    return obj.hasOwnProperty("date");
});

Lodash解决方案:

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

示例:

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

答案 3 :(得分:1)

您可以使用Array.prototype.filter。此外,您可以使用ES6对象分配解构来使其简洁:

x <- rnorm(30)
median(x) # -0.01192347

# does not match:
do.call("median",as.list(x))  # -1.912244

答案 4 :(得分: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);

答案 5 :(得分: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);