如何使用另一个数组中其他对象的键替换对象数组中的值

时间:2019-08-24 16:09:19

标签: javascript

我有2个对象数组

注意:由于状态和原始语言一直在变化,因此无法手动设置,这些是自定义字段。来自字段的子弹构成所有自定义字段。

const items = [
  {
    name: 'Surviving the Game',
    status: 'ffdb29ba075fcbc0b71295c31a13d64f',
    original-language: 'b4ebbe06702794d1cf375274197267b2',
  },
  {
    name: 'Some Movie',
    status: 'cd53c082c6ca9e7d3ec66890e66c01f3',
    original-language: '7a1cac74217747933bb3915888dea090',
  },
];
const fields = [
  {
    slug: 'status',
    options: [
      {
        name: 'Released',
        id: 'ffdb29ba075fcbc0b71295c31a13d64f',
      },
      {
        name: 'Upcoming',
        id: 'cd53c082c6ca9e7d3ec66890e66c01f3',
      },
    ],
  },
  {
    slug: 'original-language',
    options: [
      {
        name: 'de',
        id: 'b4ebbe06702794d1cf375274197267b2',
      },
      {
        name: 'en',
        id: '7a1cac74217747933bb3915888dea090',
      },
    ],
  },
];

[项目]中的状态和原始语言的ID值与相应字段数组中的选项相匹配。

我正在尝试为[项目]返回一个新数组,其名称来自具有匹配ID的选项。

例如:

[
  {
    name: 'Surviving the Game',
    status: 'Released',
    original-language: 'de',
  },
  {
    name: 'Some Movie',
    status: 'Upcoming',
    original-language: 'en',
  },
];

在ES6 / 7中我将如何处理?

我不确定从哪里开始

3 个答案:

答案 0 :(得分:1)

我将通过创建一个lookup对象来实现此目的,该对象包含您的状态和语言的查找。然后,您可以在通过items进行映射时使用此查找对象。

var items = [
  {
    name: 'Surviving the Game',
    status: 'ffdb29ba075fcbc0b71295c31a13d64f',
    "original-language": 'b4ebbe06702794d1cf375274197267b2'
  },
  {
    name: 'Some Movie',
    status: 'cd53c082c6ca9e7d3ec66890e66c01f3',
    "original-language": '7a1cac74217747933bb3915888dea090'
  }
];

var fields = [
  {
    slug: 'status',
    options: [
      {
        name: 'Released',
        id: 'ffdb29ba075fcbc0b71295c31a13d64f'
      },
      {
        name: 'Upcoming',
        id: 'cd53c082c6ca9e7d3ec66890e66c01f3'
      }
    ]
  },
  {
    slug: 'original-language',
    options: [
      {
        name: 'de',
        id: 'b4ebbe06702794d1cf375274197267b2'
      },
      {
        name: 'en',
        id: '7a1cac74217747933bb3915888dea090'
      }
    ]
  }
];

const lookup = {};

fields.forEach(field => {
  lookup[field.slug] = field.options.reduce((all, option) => ({
    ...all,
    [option.id]: option.name
  }), {})
});

const translatedItems = items.map(item => {
  return Object.entries(item)
    .reduce((all, [key, val]) => ({
      ...all,
      [key]: lookup[key] ? lookup[key][val] : val
    }),{});
});

console.log(translatedItems);

答案 1 :(得分:1)

我将定义一个获取字段值的函数,如下所示:

function valueForField(field, id) {
    const field = fields.find((itemfields) => itemfields.slug === field);
    if(!field) return null;
    const option = field.options.find(option => option.id === id);
    if(!option) return null;
    return option.name;
}

然后可以像这样使用它:

const newItems = items.map(item => {
    const { name } = item;
    const newItem = {name};
    newItem["original-language"] = valueForField('original-language', item["original-language"]);
    newItem.status = valueForField('status', item.status);
    return newItem;
});

答案 2 :(得分:0)

使用map创建具有namestatusoriginalLanguage字段的对象新数组以及find方法以获取{{1 }}从name中获得每个fields标识符。

status