简体   繁体   English

如何从推入平面数组的嵌套数组中获取值?

[英]How do I get values from a nested array pushed into a flat array?

I have an api returning a dataset like this:我有一个 api 返回这样的数据集:

const data = {
  session: ....,
  timestamp: ....,
  samples: [
    {
      key: 'I',
      values: [
        { timing: '12356timingdatething', reading: -37.1234 },
        { timing: '12356timingdatething', reading: -32.1234 },
        { timing: '12356timingdatething', reading: 1.1234 },
        // ....
      ],
    },
    {
      key: 'I',
      values: [
        { timing: '12356timingdatething', reading: -100.1234 },
        { timing: '12356timingdatething', reading: 5.1234 },
        { timing: '12356timingdatething', reading: 5.3334 },
        // ....
      ],
    },
    {
      key: 'I',
      values: [
        { timing: '12356timingdatething', reading: -37.1234 },
        { timing: '12356timingdatething', reading: -32.1234 },
        { timing: '12356timingdatething', reading: 1.1234 },
        // ....
      ],
    },
  ]
}

what I want to do is grab values from samples and push them into a new array that will just be a flat array, something like this:我想要做的是从samples获取values并将它们推送到一个新数组中,该数组将只是一个平面数组,如下所示:

const newData = [
  [
    { timing: '12356timingdatething', reading: -37.1234 },
    { timing: '12356timingdatething', reading: -32.1234 },
    { timing: '12356timingdatething', reading: 1.1234 },
    // ....
    { timing: '12356timingdatething', reading: -100.1234 },
    { timing: '12356timingdatething', reading: 5.1234 },
    { timing: '12356timingdatething', reading: 5.3334 },
    // ....
    { timing: '12356timingdatething', reading: -37.1234 },
    { timing: '12356timingdatething', reading: -32.1234 },
    { timing: '12356timingdatething', reading: 1.1234 },
    // ....
  ]

I was able to get samples into a new array like so:我能够将samples放入一个新数组中,如下所示:

this.setState(prevState => ({
  newArray: [...prevState.newArray, [...data.samples] ]
}));

I'm open to using libraries like lodash or ramda if there's a library that exists that would make this easier.如果存在可以使这更容易的库,我愿意使用lodashramda之类的库。

You could use reduce() or flatMap() :您可以使用reduce()flatMap()

const newData = data.reduce((accumulated, current) => [...accumulated, ...current.values], []);

Or:或者:

const newData = data.flatMap(item => item.values);

You can make use of .reduce() :您可以使用.reduce()

let ans = data.samples.reduce((cum,x)=>{
 return [...cum,...(x.values)];   
},[])

With Ramda you can use R.chain with R.prop to values flatten all the values :使用R.chain ,您可以使用R.chainR.prop来压平所有values

 const fn = R.chain(R.prop('values')) const data = {"samples":[{"key":"I","values":[{"timing":"12356timingdatething","reading":-37.1234},{"timing":"12356timingdatething","reading":-32.1234},{"timing":"12356timingdatething","reading":1.1234}]},{"key":"I","values":[{"timing":"12356timingdatething","reading":-100.1234},{"timing":"12356timingdatething","reading":5.1234},{"timing":"12356timingdatething","reading":5.3334}]},{"key":"I","values":[{"timing":"12356timingdatething","reading":-37.1234},{"timing":"12356timingdatething","reading":-32.1234},{"timing":"12356timingdatething","reading":1.1234}]}]} const result = fn(data.samples) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

With lodash you can use _.flatMap() :使用 lodash 你可以使用_.flatMap()

 const data = {"samples":[{"key":"I","values":[{"timing":"12356timingdatething","reading":-37.1234},{"timing":"12356timingdatething","reading":-32.1234},{"timing":"12356timingdatething","reading":1.1234}]},{"key":"I","values":[{"timing":"12356timingdatething","reading":-100.1234},{"timing":"12356timingdatething","reading":5.1234},{"timing":"12356timingdatething","reading":5.3334}]},{"key":"I","values":[{"timing":"12356timingdatething","reading":-37.1234},{"timing":"12356timingdatething","reading":-32.1234},{"timing":"12356timingdatething","reading":1.1234}]}]} const result = _.flatMap(data.samples, 'values') console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

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

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