【问题标题】:Create new object if array has multiple ids如果数组有多个 id,则创建新对象
【发布时间】:2021-01-20 07:02:01
【问题描述】:

我们有一个类似的数组

const arr = [{
    name: 'foo',
    age: 23,
    id: [1, 2]
}, {
    name: 'bar',
    age: 24,
    id: [3, 4]
}, {
    name: 'baz',
    age: 24,
    id: 5
}];

如果对象具有 id 数组,则应将新对象添加到数组中

预期

const newArry = [{
    name: 'foo',
    age: 23,
    id: 1,
}, {
    name: 'foo',
    age: 23,
    id: 2
}, {
    name: 'bar',
    age: 24,
    id: 3
}, {
    name: 'bar',
    age: 24,
    id: 4
}, {
    name: 'baz',
    age: 24,
    id: 5
}]

任何人都知道更好的方法。请帮忙!!!

【问题讨论】:

    标签: javascript arrays angular


    【解决方案1】:

    您可以为此使用flatMap。首先,您将检查 id 是否为数组类型,如果是,则对其应用 map 并返回适当的值。

    const arr = [{name: 'foo', age: 23, id: [1,2]}, {name: 'bar', age: 24, id: [3,4]}, {name: 'baz', age: 24, id: 5}];
    
    const result = arr.flatMap(e=>Array.isArray(e.id) ? e.id.map(id=>({...e,id})) : e);
    
    console.log(result);

    但是,请检查 flatMap here 的浏览器兼容性。作为替代,您可以使用 reduce 方法。

    【讨论】:

      【解决方案2】:

      您可以使用 array#reduce 并将每个 id 推送到数组 id 并简单地为字符串 id 添加对象。

      const arr = [{name: 'foo', age: 23, id: [1,2]}, {name: 'bar', age: 24, id: [3,4]}, {name: 'baz', age: 24, id: 5}],
            result = arr.reduce((r, o) => {
              if(Array.isArray(o.id)) {
                o.id.forEach(id => r.push({ ...o, id }));
              } else {
                r.push(o);
              }
              return r;
            }, []);
      console.log(result);

      【讨论】:

        【解决方案3】:

        Tweeked array.forEach 用于实现。希望这会有所帮助。

        const arr = [{
            name: 'foo',
            age: 23,
            id: [1, 2]
        }, {
            name: 'bar',
            age: 24,
            id: [3, 4]
        }, {
            name: 'baz',
            age: 24,
            id: 5
        }];
        
        const newArry = [];
        arr.forEach(item => {
          if (typeof(item.id) === 'number') {
            newArry.push({
              name: item.name,
              age: item.age,
              id: item.id,
            })
          } else {
            item.id.forEach( idItem => {
              newArry.push( {
                name: item.name,
                age: item.age,
                id: idItem,
              })
            })
          }
        })
        
        console.log(newArry);

        【讨论】:

          猜你喜欢
          • 2023-02-03
          • 1970-01-01
          • 2019-12-18
          • 2021-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          • 2021-02-28
          相关资源
          最近更新 更多