1

У меня есть JavaScript-массив с заполненными объектами и вы хотите удалить каждый объект без данных. Это может выглядеть следующим образом:Удалить пустые объекты из массива

var myArray = [ {id: "28b", text:"Phill"}, 
       {id: "12c", text:"Peter"}, 
       {id: "43f", text:"Ashley"}, 
       {id: "43f", text:"Ashley"}, 
       {id: "", text:""}, 
       {id: "9a", text:"James"}, 
       {id: "", text:""}, 
       {id: "28b", text:"Phill"} 
       ]; 

Я уже использую _.uniq из underscore.js удалить все дубликаты из моего массива, который работает отлично. Хотя они уникальны, один пустой объект всегда остается, когда я динамически заполняю данные (потому что есть пустые наборы данных). Я уже пробовал функцию _.without, как указано здесь: Remove empty elements from an array in Javascript, но это не работает. Вот моя попытка:

myArray = _.without(myArray, {id:"",text:""}); 

Массив должен выглядеть следующим образом:

   [ {id: "28b", text:"Phill"}, 
       {id: "12c", text:"Peter"}, 
       {id: "43f", text:"Ashley"}, 
       {id: "9a", text:"James"}, 
       ]; 

Я также использую JQuery, если есть решение с этой библиотекой.

+1

что значит * пусто *? добавьте еще несколько данных и что нужно удалить. –

+0

'{id:" ", текст:" "}' не пустой объект. Если вы хотите удалить это событие, отфильтруйте его. И я догадываюсь, наконец, что вы хотите удалить любой объект, у которого нет 'id', указанного –

ответ

0

// Code goes here 
 

 
myArray = [{ 
 
    id: "28b", 
 
    text: "Phill" 
 
    }, { 
 
    id: "12c", 
 
    text: "Peter" 
 
    }, { 
 
    id: "43f", 
 
    text: "Ashley" 
 
    }, { 
 
    id: "43f", 
 
    text: "Ashley" 
 
    }, { 
 
    id: "", 
 
    text: "" 
 
    }, { 
 
    id: "9a", 
 
    text: "James" 
 
    }, { 
 
    id: "", 
 
    text: "" 
 
    }, { 
 
    id: "28b", 
 
    text: "Phill" 
 
    } 
 

 
] 
 

 
var result = _.filter(_.uniq(myArray, function(item, key, a) { 
 
    return item.id; 
 
}), function(element) { 
 
    return element.id && element.text 
 
}); 
 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+0

работает безупречно, спасибо! :) – Jandroide

1

Вы можете попробовать это:

_.filter(myArray, _.isEmpty) 

Я предполагаю, что пустые средства

var obj = {} 
+0

, было бы безопаснее делать'! Obj || _.isEmpty (obj) ' –

+0

Мне нравится более декларативный подход - вопрос вкуса Думаю –

+0

Я просто имел в виду, вроде бы удалял бы пустой? он также удалит null или undefined? –

1

Нет необходимости в библиотеке, просто взять Array#filter и объект. С динамической фильтрацией для всех свойств.

var myArray = [{ id: "28b", text: "Phill" }, { id: "12c", text: "Peter" }, { id: "43f", text: "Ashley" }, { id: "43f", text: "Ashley" }, { id: "", text: "" }, { id: "9a", text: "James" }, { id: "", text: "" }, { id: "28b", text: "Phill" }], 
 
    filtered = myArray.filter(function (a) { 
 
     var temp = Object.keys(a).map(function (k) { return a[k]; }), 
 
      k = temp.join('|'); 
 

 
     if (!this[k] && temp.join('')) { 
 
      this[k] = true; 
 
      return true; 
 
     } 
 
    }, Object.create(null)); 
 

 
console.log(filtered);

+0

Pure js - еще лучшее решение, чем с underscore.js, спасибо за это! Есть также функция короткого фильтра для удаления всех дубликатов, так что мне не нужно вообще использовать функции underscore.js? – Jandroide

+0

@Jandroide, см. Редактирование. –

+0

Я очень ценю вашу помощь, но дубликаты все еще остаются – Jandroide

0

попытка (ECMA5 +):

var myArrayFiltered = myArray.filter((ele) => { 
    return ele.constructor === Object && Object.keys(ele).length > 0 
});