2017-04-18 80 views
1
Business = { 
    1: { Country: "France" }, 
    2: { Country: "France" }, 
    3: { Country: "UnitedKingdom" }, 
    4: { Country: "France" } 
} 

我有一個企業(分配ID)的對象列表,每個企業都有自己的國家。基於屬性計算對象中物品的總數

我的問題是通過屬性找到金額的最佳方法是什麼?例如,如果我想查找法國企業的總數,它將根據代碼示例返回3。

+5

你的數據是無效的。你有一個數組還是一個對象? –

+0

對不起,這是一個對象 – epayne

回答

2

你可以嘗試這樣的事:

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)返回與可枚舉的數組Business擁有
  • map適用我們傳遞到上一步驟的輸出的功能,並返回一個新的數組。此數組的元素是業務的值
  • reduce應用我們爲上一步的數組的每個元素傳遞的函數,並且當Country屬性的值等於「France」時,我們將值加1的累加器,acc,否則我們不改變。然後返回累加器的值。
+0

謝謝!我需要研究.map和.reduce的作用 – epayne

+0

@epayne歡迎您!我很高興我的幫助。這裏有兩個有用的鏈接https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map和https://developer.mozilla.org/en/docs/Web/的JavaScript /參考/ Global_Objects /陣列/減少。 – Christos

1

您的對象有問題。你可以使用以下,但我不得不問,爲什麼不使用一個數組?

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

+0

「過濾器」對我來說最有意義,我也許是最高性能的人。 – unitario

0

首先,您的語法不正確,將導致錯誤。

如果包含在陣列中的所有對象,你就不會要的對象保持自己的標識,你可以做到這一點很容易:

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

1

你可以使用一個計數國家的對象。

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

+0

謝謝妮娜,這是我的最終目標。我需要進一步研究Object.keys – epayne

0

Object.keys返回對象的密鑰。您可以循環鍵並計算您想要的結果。下面是一個例子..

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