【问题标题】:Build an array of objects from another array of object by selecting just a part of its properties通过仅选择其属性的一部分从另一个对象数组构建对象数组
【发布时间】:2021-05-14 09:34:40
【问题描述】:

具有以下输入数组:

const initialArray = [{name: 'john', age: 12, height: 178, likes: 'music'},
                      {name: 'mike', age: 22, height: 181, likes: 'sport'},
                      {name: 'anna', age: 18, height: 175, likes: 'sleep'},
                      {name: 'paul', age: 24, height: 170, likes: 'drink'}
                     ];

我想构建一个新的对象数组,其中只包含一些属性,例如,只包含 nameheight。结果是:

result = [{name: 'john', height: 178},
          {name: 'mike', height: 181},
          {name: 'anna', height: 175},
          {name: 'paul', height: 170}
         ];

尝试使用map,但可能有问题:

  const result = initialArray.map((a) => {
    a.name, a.height
  });

【问题讨论】:

  • 试试这个initialArray.map((a) => ({name: a.name, height: a.height}));

标签: javascript arrays object ecmascript-6


【解决方案1】:

您应该在{} 中使用return 关键字,或者使用()(括号)扭曲代码。

您可以尝试使用Destructuring assignment,它允许您在结果对象中指定所需的属性名称:

const initialArray = [
  {name: 'john', age: 12, height: 178, likes: 'music'},
  {name: 'mike', age: 22, height: 181, likes: 'sport'},
  {name: 'anna', age: 18, height: 175, likes: 'sleep'},
  {name: 'paul', age: 24, height: 170, likes: 'drink'}
];
const result = initialArray.map(({name, height}) => ({name,height}));
console.log(result);

【讨论】:

    【解决方案2】:

    你应该像下面这样返回对象。

    const result = initialArray.map((a) => {
      return {name:a.name, height:a.height}
    });
    

    【讨论】:

      【解决方案3】:

      您可以使用mapreducefor..of 循环轻松实现此目的

      1) 使用地图

      const initialArray = [
        { name: "john", age: 12, height: 178, likes: "music" },
        { name: "mike", age: 22, height: 181, likes: "sport" },
        { name: "anna", age: 18, height: 175, likes: "sleep" },
        { name: "paul", age: 24, height: 170, likes: "drink" },
      ];
      
      const result = initialArray.map(({ name, height }) => ({ name, height }));
      console.log(result);

      2) 使用reduce

      const initialArray = [
        { name: "john", age: 12, height: 178, likes: "music" },
        { name: "mike", age: 22, height: 181, likes: "sport" },
        { name: "anna", age: 18, height: 175, likes: "sleep" },
        { name: "paul", age: 24, height: 170, likes: "drink" },
      ];
      
      const result = initialArray.reduce((acc, { name, height }) => {
        acc.push({ name, height });
        return acc;
      }, []);
      console.log(result);

      3) 使用 for..of 循环

      const initialArray = [
        { name: "john", age: 12, height: 178, likes: "music" },
        { name: "mike", age: 22, height: 181, likes: "sport" },
        { name: "anna", age: 18, height: 175, likes: "sleep" },
        { name: "paul", age: 24, height: 170, likes: "drink" },
      ];
      
      const result = [];
      for (let { name, height } of initialArray) {
        result.push({ name, height });
      }
      console.log(result);

      【讨论】:

        【解决方案4】:

        另一种方法是使用 lodash 的选择(如果您需要动态解析属性的名称)或 ramda's pick 方法正是这样做的

        const result = initialArray.map(R.pick(['name', 'height']));
        

        【讨论】:

          猜你喜欢
          • 2020-02-20
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 2019-09-19
          • 2019-07-18
          • 2021-03-30
          • 2020-01-27
          • 2021-07-03
          相关资源
          最近更新 更多