如何通过不同的条件访问、合并和收集嵌套数据结构中的数组值?

How to access, merge and collect array values within a nested data structure by different criteria?

我有以下对象数组。如您所见,我有 2 个名为 VEGGIESFRUITS 的 runType。每个 runType 都会有一个垂直列表。例如VEGGIESSPINACH, TOMATO, ONION,FRUITS 有 APPLE, BANANA, GRAPES

let data = [
  {
    "runType": "VEGGIES",
    "verticals": [
      { 
        "vertical": "SPINACH",
        "radars": {}
      },
      {
        "vertical": "TOMATO",
        "radars": {}
      },
      {
        "vertical": "ONION",
        "radars": {}
      },
    ],
    "total_count": {}
  },
  {
    "runType": "FRUITS",
    "verticals": [
      {
        "vertical": "APPLE",
        "radars": {
           
         }
      },
      {
        "vertical": "BANANA",
        "radars": {}
      },
      {
        "vertical": "GRAPES",
        "radars": {
          "P5": 8
        }
      }
    ],
    "total_count": {
      "P5": 8
    }
  }
]

就我而言,我想提取这些 vertical 值并将它们放入一个数组中。对于常规对象数组,我们可以使用此代码来完成上述任务。

let result = data.map(({ verticals }) => vertical)

但是我的代码在对象数组中有对象数组。有人可以让我知道如何实现这 3 个场景吗

  1. 场景 1 - 获取两种 runType 的所有垂直行业。结果应该是 [菠菜、番茄、洋葱、苹果、香蕉、葡萄]
  2. 场景 2- 获取 runType = 'VEGGIES' 的所有垂直行业。结果应该是 [菠菜、番茄、洋葱]
  3. 场景 3 - 获取 runType = 'FRUITS' 的所有垂直行业。结果应该是 [苹果、香蕉、葡萄]

有人可以阐明这个特定数据吗?

试试这个:

let data = [{
    "runType": "VEGGIES",
    "verticals": [{
        "vertical": "SPINACH",
        "radars": {}
      },
      {
        "vertical": "TOMATO",
        "radars": {}
      },
      {
        "vertical": "ONION",
        "radars": {}
      },
    ],
    "total_count": {}
  },
  {
    "runType": "FRUITS",
    "verticals": [{
        "vertical": "APPLE",
        "radars": {

        }
      },
      {
        "vertical": "BANANA",
        "radars": {}
      },
      {
        "vertical": "GRAPES",
        "radars": {
          "P5": 8
        }
      }
    ],
    "total_count": {
      "P5": 8
    }
  }
]

var findData = (runType) => data.filter(x => x.runType == runType).map(x => x.verticals)[0].map(i => i.vertical)

console.log("VEGGIES:", findData("VEGGIES"))
console.log("FRUITS:", findData("FRUITS"))
console.log("COMBINED:", findData("VEGGIES").concat(findData("FRUITS")))

另外map the OP also might have a look into flatMap and find ... reduce也值得一试...

let data = [{
  "runType": "VEGGIES",
  "verticals": [{ 
    "vertical": "SPINACH",
    "radars": {},
  }, {
    "vertical": "TOMATO",
    "radars": {},
  }, {
    "vertical": "ONION",
    "radars": {},
  }],
  "total_count": {},
}, {
  "runType": "FRUITS",
  "verticals": [{
    "vertical": "APPLE",
    "radars": {},
  }, {
    "vertical": "BANANA",
    "radars": {},
  }, {
    "vertical": "GRAPES",
    "radars": {
      "P5": 8,
    },
  }],
  "total_count": {
    "P5": 8,
  },
}];

// Scenario 1
// - Get all the verticals for both runType.
//   - Result should be [SPINACH, TOMATO, ONION, APPLE, BANANA, GRAPES]
console.log('Scenario 1 ... ', data

  .flatMap(({ verticals }) =>
    verticals.map(({ vertical }) => vertical)
  )
);

// Scenario 2
// - get all verticals for runType = 'VEGGIES'.
//   - Result should be [SPINACH, TOMATO, ONION]
console.log('Scenario 2 ... ', data

  .find(item => item.runType === 'VEGGIES')
  .verticals.map(({ vertical }) => vertical)
);

// Scenario 3
// - get all verticals for runType = 'FRUITS'.
//   - Result should be [APPLE, BANANA, GRAPES]
console.log('Scenario 3 ... ', data

  .find(item => item.runType === 'FRUITS')
  .verticals.map(({ vertical }) => vertical)
);


// Bonus
// - based on Array#reduce one can achieve everything at once

function groupMergeAndCollectVerticals(collector, item) {
  const { index, list } = collector;
  const { runType, verticals } = item;

  const group = (index[runType] ??= []);
  const verticalList = verticals.map(({ vertical }) => vertical);

  group.push(...verticalList);
  list.push(...verticalList);

  return collector;
}
const verticalsCollection =
  data.reduce(groupMergeAndCollectVerticals, { index: {}, list: [] });

console.log(
  'reduce based :: all at once ... ',
  verticalsCollection
);
console.log(
  'reduce based :: Scenario 1 ... ',
  verticalsCollection.list
);
console.log(
  'reduce based :: Scenario 2 ... ',
  verticalsCollection.index['VEGGIES']
);
console.log(
  'reduce based :: Scenario 3 ... ',
  verticalsCollection.index['FRUITS']
);
.as-console-wrapper { min-height: 100%!important; top: 0; }