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.

2
  • 1
    what means empty? please add some more data and what should be removed. Commented Jul 22, 2016 at 8: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 Commented Jul 22, 2016 at 8:28

4 Answers 4

7

You can try this:

_.filter(myArray, _.isEmpty)

I assume empty means

var obj = {}
Sign up to request clarification or add additional context in comments.

6 Comments

would it be safer to do !obj || _.isEmpty(obj)
I like more declarative approach - matter of taste I think
I just meant, like that would only remove empty? would it also remove null or undefined?
Isn't the OP looking for the inverse function? _.filter(myArray, _.isEmpty) will only leave empty objects, _.reject(myArray, _.isEmpty) will leave only non-empty objects.
|
5

try (ECMA5+):

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

Comments

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);

2 Comments

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?
I really appreciate your help but the duplicates are still remaining
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>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.