3

I have a JavaScript-array with objects filled in and want to remove every object with no data. It might look like this:

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"}
              ];

I already use _.uniq from underscore.js to remove all duplicates from my array, which works fine. Though they are unique, one empty Object is always left when I dynamically fill in data (because there are empty datasets). I already tried the _.without function as mentioned here: Remove empty elements from an array in Javascript but it doesn't work. Here is my attempt:

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

The array should look like this:

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

I am also using jQuery if there is a solution with this library.

Community
  • 1
  • 1
Jandroide
  • 168
  • 1
  • 1
  • 8
  • 1
    what means *empty*? please add some more data and what should be removed. – Nina Scholz Jul 22 '16 at 08:28
  • `{id:"",text:""}` isn't empty object. If you want to remove any of this occurence, filter it. And i guess, finally what you want is to remove any object that has no `id` specified – A. Wolff Jul 22 '16 at 08:28

4 Answers4

7

You can try this:

_.filter(myArray, _.isEmpty)

I assume empty means

var obj = {}
Oskar Szura
  • 2,469
  • 5
  • 32
  • 42
4

try (ECMA5+):

var myArrayFiltered = myArray.filter((ele) => {
  return ele.constructor === Object && Object.keys(ele).length > 0
});
Andy Lorenz
  • 2,905
  • 1
  • 29
  • 29
2

No need for a library, just take Array#filter and an object. With dynamic filtering, for all properties.

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);
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
  • 1
    Pure js is an even better solution than with underscore.js, thanks for that! Is there also a short filter function to remove all duplicates, so that I don't have to use underscore.js - functions at all? – Jandroide Jul 22 '16 at 09:08
  • 1
    I really appreciate your help but the duplicates are still remaining – Jandroide Jul 22 '16 at 09:31
1

// 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>
Vladu Ionut
  • 8,075
  • 1
  • 19
  • 30