Как удалить объект из массива, если свойство в объекте не существует

1

У меня есть следующий набор данных

[{
 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'. В приведенном выше примере объект с идентификатором 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 для этой цели?

заранее спасибо

Теги:
arrays
lodash

6 ответов

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);
  • 0
    Ах хорошо. Вместо удаления вы создаете и объект с ключами, которые включают в себя дату. Хорошо, спасибо, Микл
  • 0
    @ Ckappo Если это было полезно для вас, пожалуйста, поставьте этот вопрос перед будущими читателями и рассмотрите возможность его принятия, если вы считаете, что он является лучшим для вашего вопроса.
Показать ещё 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);
  • 0
    Обратите внимание, что это может вызвать проблемы, так как он ищет цепочку прототипов тоже.
  • 0
    Я не знаю, почему мой предыдущий комментарий был удален .... в любом случае. Ответ обновляется после комментария Ибрагима Махрира
1

Вы можете использовать Array#filter и Object#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);
0

Вы можете использовать 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);
  • 0
    Обратите внимание, что это может вызвать проблемы, так как он ищет цепочку прототипов тоже. Смотрите этот комментарий ; Я также пропустил это в моей первой попытке ответить на вопрос :) Решением может быть использование функции hasOwnProperty .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню