简体   繁体   中英

Count total number of items in object based on property

Business =  {
  1: { Country: "France" },
  2: { Country: "France" },
  3: { Country: "UnitedKingdom" },
  4: { Country: "France" }
}

I have an object list of Businesses (assigned an ID), with each business having their own country.

My question is what is the best method in finding the amount via property? For example if I wanted to find the total amount of French businesses it would return 3 based on the code example.

You could try something like this:

 var Business = { 1: {Country:"France"} , 2: {Country:"United Kingdom"} , 3: {Country:"France"} , 4: {Country:"France"} }; var businessInFrance = Object.keys(Business) .map(key => Business[key]) .reduce(function(acc, val){ return val.Country === "France" ? acc+=1 : acc; },0); console.log(businessInFrance); 

  • Object.keys(Business) returns an array with the enumerable that Business owns
  • map applies the function we pass to the output of the previous step and returns a new array. The element of this array are the value of the Business
  • reduce applies the function we pass for each element of the array of the previous step and when the Country property has a value equal to "France", we increment by one the value of the accumulator, acc , otherwise we return it unchanged. At then end the value of accumulator is returned.

You have an issue with your object. You could use the following, but I have to ask why not just use an array?

Business = {
  01: {Country:"France"},
  02: {Country:"United Kingdom"},
  03: {Country:"France"},
  04: {Country:"France"},
}

 const BusinessArray = [ {Country:"France"}, {Country:"United Kingdom"}, {Country:"France"}, {Country:"France"}, ] console.log( BusinessArray.filter(x => x.Country === 'France').length ) 

 Business = { 01: {Country:"France"}, 02: {Country:"United Kingdom"}, 03: {Country:"France"}, 04: {Country:"France"}, } const countriesCount = (country, businesses) => Object.keys(businesses) .filter(x => businesses[x].Country === country) .length console.log( countriesCount('France', Business), countriesCount('United Kingdom', Business) ) 

You could use an object for counting countries.

 var business = { 1: { Country: "France" }, 2: { Country: "France" }, 3: { Country: "UnitedKingdom" }, 4: { Country: "France" } }, count = Object.keys(business).reduce(function (r, k) { var country = business[k].Country; r[country] = (r[country] || 0) + 1; return r; }, Object.create(null)); console.log(count.France); console.log(count); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

First, your syntax is incorrect and will lead to an error.

If you contain all the objects in an array, you wouldn't need the objects to maintain their own identifier and you can do this very easily:

 var business = [ {country:"France"}, {country:"United Kingdom"}, {country:"France"}, {country:"France"} ]; console.log("The amount of countries is: " + business.length); var count = 0; business.forEach(function(value){ count = (value.country === "France") ? ++count : count; }); console.log("The amount of times France appears is: " + count); 

Object.keys returns the keys of object. You can loop over the keys and count your desired result. Here is an example..

 var Business = { 1:{ Country: "France" }, 2:{ Country: "France" }, 3:{ Country: "UnitedKingdom" }, 4:{ Country: "France" }}; var countByCountry = function(country){ var result = 0; Object.keys(Business).forEach(function(it){ result += (Business[it].Country === country ? 1 : 0); console.log(it, country, result); }); return result; } console.log(countByCountry('France')); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM