通过迭代数组将方法分配给对象

Assign methods to object by iterating over an array

本文关键字:分配 对象 方法 迭代 数组      更新时间:2023-09-26

在ES5中,我知道可以使用forEach循环通过以下方式将方法分配给对象:

var myMethods = [
  {
    name: 'start',
    src: someFn
  },
  {
    name: 'stop',
    src: someOtherFn
  }
];
var myObject = {};
myMethods.forEach(function(method) {
  myObject[method.name] = method.src;
});

ES2015(或 ES6)中,是否可以在创建对象的同时定义这些方法?以下是我如何期望它工作的示例:

// example
const myObject = {
  [...myMethods.map((method) => method.name)]: [...myMethods.map(method) => method.src)]
}

最终结果如下所示:

const myObject = {
  start: someFn,
  stop: someOtherFn
}

如果有一种方法可以迭代这些方法并将它们分配给myObject,我很乐意重组myMethods数组,以便这样做。

最终目标是能够在外部模块中分配这些方法中的每一个,而不必重复定义。

是的,您可以将 Object.assign 和 spread 运算符与计算的属性名称结合使用来执行

var myObject = Object.assign({}, ...myMethods.map(({name, src}) => ({[name]: src})));

首先,我们将myMethods映射到一个小的单属性对象的数组,其键由name属性的值和src属性的值给出。然后我们使用 spread 运算符 ... 将这些作为参数传递给Object.assign。 然后Object.assign为我们将它们粘在一起。

Reduce应该可以为您解决问题。请注意,可选的第二个参数用于在开头以空对象开头。

var myMethods = [{
  name: 'start',
  src: function() {
    console.log('started')
  }
}, {
  name: 'stop',
  src: function() {
    console.log('stopped')
  }
}];
var myObject = myMethods.reduce((obj, method) => {
  obj[method.name] = method.src;
  return obj;
}, {})
console.log(myObject)
myObject.start()
myObject.stop()

尝试将同一行myMethods分配nemts 分配给myObject

var myObject = {};
someFn = function(){console.log(this)};
someOtherFn = function(){console.log(this)};
var myObject = {};
someFn = function(){};
someOtherFn = function(){}
var myMethods = [
  {
    name: (myObject["start"] = "start"),
    src: (myObject["start"] = someFn)
  },
  {
    name: (myObject["stop"] = "stop"),
    src: (myObject["stop"] = someOtherFn)
  }
];