将字符串数组映射为对象属性

Sno*_*opy 0 javascript arrays reactjs

我有一个像这样的数组.

const array =["king", "henry", "died", "while", "drinking", "chocolate", "milk"]
Run Code Online (Sandbox Code Playgroud)

我有以下初始状态

state = {
options:{}
}
Run Code Online (Sandbox Code Playgroud)

如果我想将此数组映射到我的状态并将每个索引字符串分配为我将this.state.options如何执行此操作的属性?

所以最终的结果是:

console.log(this.state.options)
Run Code Online (Sandbox Code Playgroud)

输出:{king:null,henry:null,death:null,while:null,drinking:null,chocolate:null,milk:null}

我认为在那之后它将是未定义的而不是null ...但是有什么建议吗?

Ice*_*kle 7

我相信你是在寻找reduce而不是map

const array =["king", "henry", "died", "while", "drinking", "chocolate", "milk"];

const state = {
  options: array.reduce( (current, item) => {
      current[item] = null;
      return current;
    }, {})
};

console.log( state );
Run Code Online (Sandbox Code Playgroud)


amn*_*amn 6

您可以使用该Object.fromEntries功能:

const array = [ "king", "henry", "died", "while", "drinking", "chocolate", "milk" ];
state = {
    options: Object.fromEntries(array.map(value => [ value, null ]))
};
Run Code Online (Sandbox Code Playgroud)

您的用户代理可能不提供Object.fromEntries其脚本主机 - 该功能是 ECMAScript 2019 又名第 10 版的一部分 - 但您可以使用替代程序,直到它提供:

if(!Object.fromEntries)
    Object.fromEntries = entries => entries.reduce((result, entry) => (result[entry[0]] = entry[1], result), {});
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用我希望稍后广泛使用的部分语言或 API,通过提供替代实现,直到这些实现可用,此时代码将在不进行任何修改的情况下自动使用本机实现(上面显然是一个条件替代 a 或polyfill,因为它也被称为)。

  • `Object.fromEntries` 几乎**零**支持(除了 Firefox),所以它实际上不应该是一个可行的解决方案。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries (2认同)
  • 当然这样做的话那就有意义了。否则,您会假设 OP 必须克服重重困难才能使您的解决方案发挥作用。如果您提供所有必要的步骤,那么我会同意。 (2认同)