2016-08-12 40 views
2

我需要一個新的對象countriesFiltered,過濾只有人口不到10億的國家。我在地圖部分使用:return {key:countries [key]}。我認爲是不正確的,我怎麼可以建立一個新的對象?我必須使用推或類似的東西?javascript操作對象:地圖

var countries = { 
    China: 1371980000, 
    India: 1276860000, 
    'United States': 321786000, 
    Indonesia: 255461700, 
    Brazil: 204873000, 
    Pakistan: 190860000 
}; 
var countriesFiltered = Object.keys(countries).filter(function(key) { 
    return countries[key] <= 1000000000; 
}).map(function(key) { 
    return { key : countries[key]}; 
}); 
console.log(countriesFiltered); 
+0

hmm,我在運行代碼後得到了一個過濾後的國家對象。你想做什麼? – Guillermo

+0

我需要結果; var countriesFiltered = {United States':321786000, Indonesia:255461700, Brazil:204873000, Pakistan:190860000 }; – stackdave

+0

添加了答案和小提琴。 https://jsfiddle.net/swaprks/aewf0erx/ – Swaprks

回答

3

關閉!只需使用Array.reduce而不是Array.map。除非您使用ES2015,否則對象屬性名稱不能爲computed。因此,您需要使用reduce構造一個新對象,然後分別分配每個屬性。

var countries = { 
 
    China: 1371980000, 
 
    India: 1276860000, 
 
    'United States': 321786000, 
 
    Indonesia: 255461700, 
 
    Brazil: 204873000, 
 
    Pakistan: 190860000 
 
}; 
 
var countriesFiltered = Object.keys(countries).filter(function(key) { 
 
    return countries[key] <= 1000000000; 
 
}).reduce(function(obj, key) { 
 
    // Assign key/val to new object 
 
    obj[key] = countries[key]; 
 
    
 
    return obj; 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(countriesFiltered, null, 2) + '</pre>');

編輯:使用ES2015計算機名稱的屬性看起來像下面這樣。 注意這隻適用於支持的瀏覽器。

var countries = { 
 
    China: 1371980000, 
 
    India: 1276860000, 
 
    'United States': 321786000, 
 
    Indonesia: 255461700, 
 
    Brazil: 204873000, 
 
    Pakistan: 190860000 
 
}; 
 
var countriesFiltered = Object.keys(countries).filter(function(key) { 
 
    return countries[key] <= 1000000000; 
 
}).reduce(function(obj, key) { 
 
    // Create object with computed property name 
 
    // and assign to obj 
 
    return Object.assign(obj, { 
 
    [key]: countries[key] 
 
    }); 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(countriesFiltered, null, 2) + '</pre>');

獎勵:的樂趣,你可以使用replacer功能利用的JSON.stringify電源過濾的對象。雖然它表明有很多不同的方法來解決這個問題,但我不會推薦這種方法。

var countries = { 
 
    China: 1371980000, 
 
    India: 1276860000, 
 
    'United States': 321786000, 
 
    Indonesia: 255461700, 
 
    Brazil: 204873000, 
 
    Pakistan: 190860000 
 
}; 
 
var countriesFiltered = JSON.parse(JSON.stringify(countries, filterCountries)); 
 

 
function filterCountries(key, val) { 
 
    if (val > 1000000000) { 
 
    return undefined; 
 
    } 
 

 
    return val; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(countriesFiltered, null, 2) + '</pre>');

+0

;你能給我一個ES2015的解決方案嗎?謝謝 – stackdave

+0

@stackdave我使用計算機名稱屬性方法更新了答案,以及一個有趣的例子,可能會擴大您對JavaScript的使用範圍。請享用! –

+0

謝謝!非常好 – stackdave

0

嘗試使用以下功能:

Object.filter = (obj, predicate) => 
    Object.keys(obj) 
      .filter(key => predicate(obj[key])) 
      .reduce((res, key) => (res[key] = obj[key], res), {}); 


var filtered = Object.filter(countries, countrie => countrie <= 1000000000); 
console.log(filtered); 

這應該爲你做吧!

參考:JavaScript: filter() for Objects

+0

我不會推薦修改原生的'Object' [各種原因](https://www.nczonline.net/blog/2010/03/02/可維護的JavaScript,不要 - 修改 - 對象 - 您 - 下自己的/)。 –

+0

原始示例;只是做:返回國家[關鍵] <= 1000000000;而是返回{key:countries [key]};在我的例子中...我以爲我需要改變一行,但是我發現從對象中獲得一行並不是一件簡單的事情......並且做一些推動......我正在學習你的解決方案對我來說非常複雜,但我會學習,我會回覆它, – stackdave

+0

@JasonCust我不太明白;解決方案不好嗎?與Object.filter,正在修改本地對象? – stackdave

0

我不是100%肯定你正在尋找的東西,但如果你正在尋找各個國家的名稱作爲財產和人口,你可以嘗試一個新的對象。如果你想鍵值對,你可以嘗試的數組

{ 
    United States: 321786000, 
    Indonesia: 255461700, 
    Brazil: 204873000, 
    Pakistan: 190860000 
} 

var countries = { 
    China: 1371980000, 
    India: 1276860000, 
    'United States': 321786000, 
    Indonesia: 255461700, 
    Brazil: 204873000, 
    Pakistan: 190860000 
}; 
var countriesFiltered = {}; 
Object.keys(countries).filter(function(key) { 
    return countries[key] <= 1000000000; 
}).map(function(key) { 
    countriesFiltered[key] = countries[key]; 
}); 
console.log(countriesFiltered); 

這導致英寸

var countries = { 
    China: 1371980000, 
    India: 1276860000, 
    'United States': 321786000, 
    Indonesia: 255461700, 
    Brazil: 204873000, 
    Pakistan: 190860000 
}; 
var countriesFiltered = Object.keys(countries).filter(function(key) { 
    return countries[key] <= 1000000000; 
}).map(function(key) { 
    return { country: key, population: countries[key]}; 
}); 
console.log(countriesFiltered); 

編輯:回答評論

是什麼意思完全相同,reausable,在那裏我可以閱讀有關?

如果您查看@answer-38909742,你會看到,他們已經修改了Object類型和添加靜態方法Object.filter()Object.filter = (obj, predicate) => {}

簽名這就使得它可重複使用的,而不是限於的範圍功能,但對任何對象。

如果將它放置在應用程序某處的全局腳本中,則可以在任何範圍內的任何對象上重新使用此方法。

正如他的問題所述,只是通過打電話。

Object.filter(countries, countrie => countrie <= 1000000000); 
+0

這樣做,但它不會真的重複使用,因爲它很難編碼使用國家對象 – James111

+0

我正在尋找一個解決方案沒有使用:var countriesFiltered = {};我需要一個objet,而不是一個數組,我正在研究你的解決方案,謝謝 – stackdave

+0

@stackdave如果你運行第一個解決方案,它將返回一個對象,第二個解決方案返回一個數組。 – Nico

-2

嗯,我會試着去了解你的問題,而不是給你一個不同的解決方案。實際上,如果你想把一個變量作爲一個JavaScript對象的關鍵字,那麼有一個不同的方法。例如。

var obj = {}; 
var key = 'abc'; 
obj[key] = 123; 

您無法將變量作爲鍵直接指定給對象。

var key = 'abc'; 
var obj = {key : 123} 

這會導致錯誤。

這裏是你的答案

var countries = { 
    China: 1371980000, 
    India: 1276860000, 
    'United States': 321786000, 
    Indonesia: 255461700, 
    Brazil: 204873000, 
    Pakistan: 190860000 
}; 
var countriesFiltered = Object.keys(countries).filter(function(key) { 
    return countries[key] <= 1000000000; 
}).map(function(key) { 
    var obj = {}; 
    obj[key] = countries[key]; 
    return obj; 
}).reduce(function(prevKey, currentKey) { 
    return Object.assign(prevKey , currentKey); 
}) 
    console.log(countriesFiltered); 

按照已經發布了,則這個好職位。 JavaScript set object key by variable

+0

這實際上並不提供解決方案OP – James111

+0

請解釋如何無法回答James – ajaykumar

+0

您的示例返回對象數組 – Nico

0

對象只有唯一鍵。因此,如果您的國家將是唯一的,那麼您可以使用以下代碼:

var countries = { 
     China: 1371980000, 
     India: 1276860000, 
     'United States': 321786000, 
     Indonesia: 255461700, 
     Brazil: 204873000, 
     Pakistan: 190860000 
    }; 
var countriesFiltered = {}; 

for (var country in countries) { 
    if (countries[country] <= 1000000000) { 
     countriesFiltered[country] = countries[country]; 
    } 
} 

console.log(countriesFiltered); 
+0

在這裏添加了一個小提琴:https://jsfiddle.net/swaprks/aewf0erx/ – Swaprks

+0

對不起,但我正在尋找與.keys和地圖或類似的東西的解決方案 – stackdave

+0

@stackdave檢查更新的一個https://jsfiddle.net/swaprks/aewf0erx/1 / – Swaprks