繁体   English   中英

JavaScript Map function 在对象数组中使用通用键

[英]JavaScript Map function to use generic keys within array of objects

我有以下对象数组:

[
    {
        "job_id": 1,
        "job_name": "Engineer"
    },
    {
        "job_id": 2,
        "job_name": "Scientist"
    },
    {
        "job_id": 3,
        "job_name": "Teacher"
    }
]

其中以下代码用于构造 Material-UI Select - 这里的选项是上面的对象数组:

{options.map(option => {
          return (
            <MenuItem key={option.job_id} value={option.job_id}>
              {option.job_name}
            </MenuItem>
          )
})}

我的问题是,为了不将其绑定到option.job_idoption.job_name的实际键名,因为我正在查看使用具有不同键名的不同数据集,但始终遵循此键值对格式 - map function 可以更改为使其更通用,无需担心键名,但仍返回 Select 下拉列表的数据,即:

{options.map(option => {
              return (
                <MenuItem key={option.generic_id} value={option.generic_id}>
                  {option.generic_name}
                </MenuItem>
              )
    })}

我想我在问是否可以通过 map function 访问 object 密钥而不需要知道job_idjob_name

如果你不能让上游的键更通用,你可以做两件事之一

  1. 在键击中调用站点上的组件之前对其进行规范化
import { pipe, mapKeys } from 'utils';

const normaliseOption = mapKeys(key =>
      key.match(/_id$/) ? 'id'
    : key.match(/_name$/) ? 'name'
    : key
);

options.map(pipe(normaliseOption, option =>
    <MenuItem key={option.id} value={option.id}>
        {option.name}
    </MenuItem>
));
// utils
export const pipe = (...fns) => fns.reduce(
    (f, g) => x => g(f(x))
);

export const mapKeys = f => pipe(
    Object.entries,
    x => x.map(([k, v]) => [f(k), v]),
    Object.fromEntries
);

1.bis) 在上游的某个地方,您确定自己正在处理工作,您可以在没有正则表达式的情况下执行上述操作。

  1. 依靠一个通用接口来调度正确的信息
options.map(option =>
    <MenuItem key={option.getId()} value={option.getId()}>
        {option.getName()}
    </MenuItem>
);
// somewhere you know you are dealing with jobs
import JobOption from './JobOption';
const options = jobs.map(JobOption.of);
export default class JobOption {
    constructor({job_id, job_name}) {
        this.id = job_id;
        this.name = job_name;
    }
    static of (descriptor) { return new JobOption(descriptor); }
    getId () { return this.id; }
    getName () { return this.name; }
}

如果您希望能够使用动态 object 键,听起来您需要某种帮助器 function 可以接收数组和相关键并返回您的菜单项

例如

const menuBuilder = (options, keyProp, labelProp) => options.map(option => (
  <MenuItem key={option[keyProp]} value={option[keyProp]}>
    {option[labelProp]}
  </MenuItem>
))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM