【问题标题】:JAVASCRIPT - Get Value from Parent Array of Objects, inside the Child Object after Array FlatteningJAVASCRIPT - 在数组展平后从子对象内部的父对象数组中获取值
【发布时间】:2020-05-18 22:42:20
【问题描述】:

我有一个对象数组,它有一些值。例子:

bigArray: [
  {
   greatName: 'Name String - #1',
   array: [{
     id: 1,
     name: 'string name - #1'
   }]
  },
  {
   greatName: 'Name String - #2',
   array: [{
     id: 2,
     name: 'string name - #2'
   }]
  },
  {
   greatName: 'Name String - #3',
   array: [{
     id: 3,
     name: 'string name - #3'
   }]
  }
]

我使用了 ramda 中的以下组合函数,以获取所有数组 array 属性值并将它们展平为单个数组:

  const extractRB = compose(
    flatten,
    map(props(['array']))
  );

这给了我以下数组:

// Flatten Array:
flatten: [
  {
     id: 1,
     name: 'string name - #1'
   },
   {
     id: 2,
     name: 'string name - #2'
   },
   {
     id: 3,
     name: 'string name - #3'
   }
]

现在,这是我的功能的要求。 问题是我还需要greatName,每个对象内部的属性值,以便映射它们。但我找不到一种方法来实际获取对象内部的正确值..

我想要实现的是这个对象数组。 Keep in mind that I can have dozens of Objects in Big Array, and hundrends of Objects inside each child array:

// Flatten Array:
flatten: [
  {
     id: 1,
     name: 'string name - #1'
     greatName: 'Name String - #1',
   },
   {
     id: 2,
     name: 'string name - #2',
     greatName: 'Name String - #2',
   },
   {
     id: 3,
     name: 'string name - #3',
     greatName: 'Name String - #3',
   }
]

我这样做了,将原始对象从展平数组中展开,并将greatName 属性添加到其中,但是如何计算每个对象的正确值。对象和要作为条件的数组之间没有共同的值:

flatten.map(flatObj =>  {...flatObj, greatName: bigArray.map(// what operation can I do here, to get the correct value for each object inside the `bigArray` )});

我尝试了很多条件操作,但它们总是返回 false。 Mayne 有一种方法可以处理每个 array 的长度,但不知道该怎么做。

非常感谢您的帮助..!!谢谢!!

【问题讨论】:

    标签: javascript arrays ramda.js flatten


    【解决方案1】:

    你可以试试这个,也许这会解决你的问题:

    bigArray.forEach((item)=>{
    item.array.greatName  = item.greatName;
    delete item.greatName;
    })
    

    只需控制台 bigArray,不要使用它,只需尝试上述方法

     const extractRB = compose(
        flatten,
        map(props(['array']))
      );
    

    【讨论】:

    • 感谢您的回答。在这种情况下是不可能的。我在这些对象中还有另外 25 个属性。我需要一种通用解决方案,因为我将重新使用该解决方案,用于 greatName 用于不同部分的其他属性。
    【解决方案2】:

    var bigArray= [
        {
         greatName: 'Name String - #1',
         array: [{
           id: 1,
           name: 'string name - #1'
         }]
        },
        {
         greatName: 'Name String - #2',
         array: [{
           id: 2,
           name: 'string name - #2'
         }]
        },
        {
         greatName: 'Name String - #3',
         array: [{
           id: 3,
           name: 'string name - #3'
         }]
        }
      ]
    
    
      console.log(bigArray.flatMap(({greatName, array}) => array.flatMap(x => ({greatName, ...x}))))

    如果array属性总是只有1个元素,那么你可以写得更短:

      bigArray.map(({greatName, array}) => ({greatName, ...array[0]}))
    

    【讨论】:

    • 正如我所说,在问题中。数组显然没有一个元素。它有数百甚至数千个对象。不过还是谢谢!!
    • 无论如何,我的第一个示例适用于多个元素
    • 我有。谢谢!!
    • 如果你想使用你的 flatten,你可以这样做:` flatten.map(flatObj => ({...flatObj, greatName: bigArray.find(x => x.array.find (a => a.id === flatObj.id) ).greatName}));`
    猜你喜欢
    • 2021-08-22
    • 2020-07-19
    • 2020-07-14
    • 2018-02-24
    • 2015-05-23
    • 2023-01-11
    • 1970-01-01
    • 2022-01-04
    • 2017-05-13
    相关资源
    最近更新 更多