javascript操纵对象:地图

时间:2016-08-12 03:59:26

标签: javascript

我需要获得一个新的对象countryFiltered,过滤只有十亿人口的国家。我在地图部分使用:return {key:countries [key]}。我认为不正确,我如何建立一个新的对象?我必须使用推或类似的东西?

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

5 个答案:

答案 0 :(得分:3)

关闭!只需使用Array.reduce代替Array.map即可。除非您使用ES2015,否则对象属性名称不能为computed。因此,您需要使用reduce构造一个新对象,然后单独分配每个属性。

&#13;
&#13;
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>');
&#13;
&#13;
&#13;

编辑:使用ES2015计算出的名称属性如下所示。 请注意,这仅适用于支持的浏览器。

&#13;
&#13;
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>');
&#13;
&#13;
&#13;

奖励:为了好玩,您可以使用replacer功能来利用JSON.stringify的功能来过滤对象。虽然它确实表明有很多不同的方法来解决这个问题,但我不推荐这种方法。

&#13;
&#13;
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>');
&#13;
&#13;
&#13;

答案 1 :(得分: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

答案 2 :(得分:0)

我不是100%肯定你在寻找什么,但如果你正在寻找一个新的对象,每个国家的名字都作为财产和人口,你可以尝试。

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

这导致:

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

如果你想要一组Key Value Pairs,你可以试试。

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

编辑:回复评论

  
    

究竟是什么意思,可以理解,在哪里可以读到这个?

  

如果您查看@answer-38909742,您会看到他们修改了Object类型并添加了一个静态方法Object.filter(),其签名为Object.filter = (obj, predicate) => {}

然后使其可重复使用,并且不限于函数的范围,而是限于任何对象。

如果将其放在应用程序某处的全局脚本中,则可以在任何范围内的任何对象上重复使用此方法。

如他的问题所述,只需致电。

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

答案 3 :(得分: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);

答案 4 :(得分:-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