首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6 -遍历对象中的键,然后分配给新对象

ES6 -遍历对象中的键,然后分配给新对象
EN

Stack Overflow用户
提问于 2017-08-16 09:52:57
回答 3查看 2.6K关注 0票数 1

在页面加载时,我调用一个元数据API,它返回一个以元数据类型作为键名的对象,以及一个元数据对象数组作为值,如下所示:

元数据对象需要进行简化和修改,以便很好地处理我的React输入组件(每个对象将是一个单独的复选框或带有值和标签的单选按钮)。我基本上需要返回相同的格式,但使用的是值和标签键,而不是id、display_on、name等。我在容器组件中做了以下操作,以修改可以通过道具传递给表单组件的数据。问题是metadataFormattedForInput总是返回一个空对象。

代码语言:javascript
复制
function mapStateToProps(state, ownProps) {
  const metadataFormattedForInput = {};
  Object.keys(state.metadata).forEach((key) => {
    const metadataOptions = [];
    state.metadata[key].map(option => (
      metadataOptions.push({ value: option.id, label: option.name })
    ));
    return (
      Object.assign({}, metadataFormattedForInput, {
        [key]: metadataOptions,
      })
    );
  });

  return {
    metadataOptions: metadataFormattedForInput,
  };
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 10:14:21

罪魁祸首是您使用Object.assign的方式(您将这些属性添加到一个空对象中,因为它是在forEach调用中返回的)。然而,Object.assign是不必要的:

代码语言:javascript
复制
function mapStateToProps(state, ownProps) {
  const metadataFormattedForInput = {};

  Object.keys(state.metadata).forEach(key => {
    metadataFormattedForInput[key] = state.metadata[key].map(option =>
      ({ value: option.id, label: option.name })
    );
  });

  return {
    metadataOptions: metadataFormattedForInput,
  };
}

const metadata = {
  phaseofthegame: [{id: 1, name: 'foo'}],
  theme: [{id: 2, name: 'bar'}]
};

console.log(
  mapStateToProps({ metadata }).metadataOptions
);

如果您想继续使用Object.assign,那么可以将它与Array.reduce结合起来。

代码语言:javascript
复制
function mapStateToProps(state, ownProps) {
  const renameProps = (acc, key) => Object.assign(acc, {
    [key]: state.metadata[key].map(option =>
      ({ value: option.id, label: option.name })
    )
  });

  const metadataOptions =
    Object.keys(state.metadata).reduce(renameProps, {});

  return { metadataOptions };
}
票数 4
EN

Stack Overflow用户

发布于 2017-08-16 10:20:58

下面是您的代码的一些问题:

  • 您使用forEach的方式是错误的,forEach不返回任何值。如果您想返回一些值,请使用map
  • 而且,您正在使用map,并像使用forEach一样使用它--也就是说,您没有使用返回的值 函数mapStateToProps(state,ownProps) { let metadataFormattedForInput =ownProps key) => { let metadataOptions =state.metadatakey.map(选项=> ({ value: option.id,label: option.name } );metadataFormattedForInputkey = metadataOptions;返回metadataFormattedForInput;};{});返回{ metadataOptions: metadataFormattedForInput,};}
票数 0
EN

Stack Overflow用户

发布于 2017-08-16 11:30:26

正如其他人所说的,以及其他一些问题:

  • forEach回调中返回值没有任何影响
  • 另一方面,map回调应该有一个返回值。
  • Object.assign不改变第二个参数,因此根本不修改metadataFormattedForInput

下面是一种实现此功能的方法,将Object.assign调用移到map之外,并使用扩展语法构建输出:

代码语言:javascript
复制
function mapStateToProps(state, ownProps) {
    return {
        metadataOptions: Object.assign(...Object.keys(state.metadata).map(key => (
            { [key]: state.metadata[key].map(option => (
                    { value: option.id, label: option.name }
                ))
            }
        )))
    };
}


var state = {
    metadata: {
        phaseofthegame: [
            { id: 123, display_on: ['a', 'b'], name: 'Attacking' },
            { id: 456, display_on: ['c', 'd'], name: 'Transition to Attack' },
        ],
        theme: [
            { id: 789, display_on: ['e', 'f'], name: 'Rondo' },
            { id: 101, display_on: ['g', 'h'], name: 'Defending Individually' },
        ]
    }
};

state = mapStateToProps(state);

console.log(JSON.stringify(state, null, 2));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45710389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档