JavaScript是否有一种“添加”对象的自然方式,即添加或覆盖属性?

时间:2016-06-23 21:59:26

标签: javascript

我想知道JavaScript是否有办法做某事

var x = { 'a' : 4, 'b' : -1 }; 
var y = { 'c' : 0 }; 
var z = x + y; // { 'a' : 4, 'b' : -1, 'c' : 0 }

滚动我自己的功能或导入库之外。

我想知道的原因是因为我想使用reduce来获取数组中的唯一值,例如

var arr = [1, 5, 1, 10, 239, -1, 1, 5]; 
var unique = Object.keys(arr.reduce((prev,cur) => ???, {})).map(key => key); // [1, 5, 10, 239, -1];

我不知道为上面的???添加什么。

1 个答案:

答案 0 :(得分:4)

对于您的第一个示例,它是Object.assign(这是ES2015中的新功能,但它可以针对较旧的JavaScript引擎进行填充):

var x = { 'a' : 4, 'b' : -1 }; 
var y = { 'c' : 0 }; 
var z = Object.assign({}, x, y);
console.log(z); // { 'a' : 4, 'b' : -1, 'c' : 0 }

  

我想知道的原因是因为我想使用reduce来获取数组中的唯一值,例如

实际上并没有这样做,可以使用重复搜索阵列方法(reduce可以使用它,但它不会比forEach更多地为你买单) :

var arr = [1, 5, 1, 10, 239, -1, 1, 5]; 
var unique = arr.reduce(function(result, entry) {
  if (result.indexOf(entry) == -1) {
    result.push(entry);
  }
  return result;
}, []);
console.log(unique);

...或者map-to-object-properties-and-then-the-property-names-at-the-end方法,其中reduce再次对你没有多大帮助:

var arr = [1, 5, 1, 10, 239, -1, 1, 5]; 
var unique = Object.keys(arr.reduce(function(result, entry) {
  result[entry] = true;
  return result;
}, {}));
console.log(unique);

在后者中,你最终会得到字符串而不是数字。当然,您可以通过在末尾添加.map(function(entry) { return +entry; })将其重新转换为数字。