首页 > 解决方案 > 如何使用 JavaScript ES6 过滤和转换这个集合?

问题描述

我有一个查询函数,它输出一组元素,具有如下简化结构:

var obj = [
  {
    body: [
      {
        prop1: 2,
        prop2: 17,
        // ...more props,
        date: '2020-08-30',
      },
      {
        prop1: 2,
        prop2: 1,
        // ...more props,
        date: '2020-08-29',
      },
      // ...
    ],
    // ...additional elements,
    slug: 'Bay'
  },
  // ...
]

如何仅使用 JavaScript 代码或 ES6 函数有效地过滤和转换此结果对象,其中date嵌套在body数组中的值是今天并且排除了附加元素?

这是我的预期结果:

var obj = [
 {
   prop1: 2,
   prop2: 17,
   // ...more props,
   date: '2020-08-30',
   slug: 'Bay'
 },
 // ...
]

编辑:要清楚,

  1. body匹配条件(今天)的数组内的对象date应合并到父对象。
  2. 该结构保证不会有重复的属性。body每个数组中最多只存在一个对象date
  3. slug, prop1,prop2等都是唯一索引,也不应该引起重复的属性问题。
  4. 每个对象中的body数组和集合本身都会非常大,因此如果解决方案有效,我将不胜感激。

并且还应该清楚的是,如果date今天不匹配body数组中的任何对象,它应该跳过父对象。

例如:

var obj = [
  { // Object 1
    body: [
      {
        prop1: 2,
        prop2: 17,
        // ...more props,
        date: '2020-08-30',
      }
    ],
    // ...additional elements,
    slug: 'Bay'
  },
  { // Object 2
    body: [
      {
        prop1: 2,
        prop2: 1,
        // ...more props,
        date: '2020-08-29',
      }
    ],
    // ...additional elements,
    slug: 'Mino'
  }
]

预期结果将是:

var obj = [
 { // Object 1
   prop1: 2,
   prop2: 17,
   // ...more props,
   date: '2020-08-30',
   slug: 'Bay'
 }
]

标签: javascriptarraysecmascript-6filter

解决方案


这将提供所需的结果

var today = "2020-08-30";
var resultObj = [];
var obj = [
  {
    body: [
      {
        prop1: 2,
        prop2: 17,
        // ...more props,
        date: '2020-08-30',
      },
      {
        prop1: 2,
        prop2: 1,
        // ...more props,
        date: '2020-08-29',
      },
      // ...
    ],
    // ...additional elements,
    slug: 'Bay'
  },
  // ...
]

for(var objData of obj) {
    for(var bodyData of objData.body) {
        if(bodyData.date == today) {
            bodyData.slug = objData.slug;
            resultObj.push(bodyData);
        }
    }
}
console.log(resultObj)

推荐阅读