1

I have a JSON database with objects. Each one has properties with a specific assigned value: a, b or c.

[
  {
    "id": 1,
    "category": "a"
  },
  {
    "id": 2,
    "category": "b"
  },
  {
    "id": 3,
    "category": "c"
  },
  {
    "id": 4,
    "category": "a"
  },
  {
    "id": 5,
    "category": "a"
  },
  {
    "id": 5,
    "category": "b"
  }
]

I want to display something like:

There is a total of 6 items: a x 3, b x 2 and c x 1.

I know I have to use objectsinmyjsondatabase.length to get the total.

I'm wondering how is it possible to get the length (number) of objects that have a specific value?

1
  • If you are looking to do the count in the view, this answer will help you. Commented Jul 27, 2017 at 21:14

3 Answers 3

5

Define a function:

getCount(character) {
  return this.objects.filter(obj => obj.category === character).length;
}

and the call it as: this.getCount('a');

Sign up to request clarification or add additional context in comments.

2 Comments

Where do I need to declare this function? In my component or my service?
@jonathan I think this should be written in component. Service should pass the data as it is to component. But yes, you can filter in service as well.
1

One way to solve your problem is to use map-reduce. Here is a quick solution. Hope that will solve your problem.

var data = [
  {
    "id": 1,
    "category": "a"
  },
  {
    "id": 2,
    "category": "b"
  },
  {
    "id": 3,
    "category": "c"
  },
  {
    "id": 4,
    "category": "a"
  },
  {
    "id": 5,
    "category": "a"
  },
  {
    "id": 5,
    "category": "b"
  }
];

// First get list of all categories
var categories = data.map(function(x) { return x["category"]; });

// Count no of items in each category
var countByCategories = categories.reduce(function(x, y) {
    if (typeof x !== "object") {
       var reduced = {};
       reduced[x] = 1;
       reduced[y] = 1;
       return reduced;
    }
    
    x[y] = (x[y] || 0) + 1;
    return x;
});

// Final build string that you want
var categoryStrings = [];
for (var category in countByCategories) {
   categoryStrings.push(category + ' x ' + countByCategories[category]); 
}

var msg = 'There is a total of ' + categories.length + ' items: ';
if (categoryStrings.length > 2) {
   msg = categoryStrings.slice(0, -1).join(', '); 
   msg += ' and ' + categoryStrings.slice(-1);
} else {
   msg = categoryStrings.join(', '); 
}

// print results
console.log(msg);

Comments

-1

You easily can count objects which have specific value like this

let objects = [
    {
        "id": 1,
        "category": "a"
    },
    {
        "id": 2,
        "category": "b"
    },
    {
        "id": 3,
        "category": "c"
    },
    {
        "id": 4,
        "category": "a"
    },
    {
        "id": 5,
        "category": "a"
    },
    {
        "id": 5,
        "category": "b"
    }
];
var filtered = new Array();
objects.filter(function (t) {
    var found = filtered.some(function (el, index) {
        if (false == (t.category === el.category)) {
            return false;
        }
        filtered[index].count = filtered[index].count + 1;
        return true;

    }, filtered);
    if (false === found) {
        filtered.push({category: t.category, count: 1});
    }
}, filtered);
console.log('There is a total of ' + objects.length + ' items: '
    + filtered.map(function (t) {
        return t.category + ' x ' + t.count;
    })
);

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.