首页 > 解决方案 > 从对象数组中删除定义的键名

问题描述

这是我的数据过滤器。基于此,我试图从我的数据中删除密钥。我想删除responseKeysratings数组中提到的键。

我被卡住了,无法从评级数组中删除键。有什么办法可以对这个问题进行递归。

let dataFilter = {
  "webPage1": {
    "responseKeys": ["releaseDate", "filmName"]
  },
  "webPage2": {
    "responseKeys": ["releaseDate", "ratings"],
    "ratings": [
      "star2",
      "star3"
    ]
  }
}
let data = [{
    "filmName": "Avatar",
    "releaseDate": "2021-09-24",
    "day": "24",
    "month": "Sep",
    "ratings": [{
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      },
      {
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      },
      {
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      }
    ]
  },
  {
    "filmName": "Morgan",
    "releaseDate": "2021-03-24",
    "day": "24",
    "month": "Mar",
    "ratings": [{
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      },
      {
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      },
      {
        "star1": "40",
        "star2": "23",
        "star3": "56",
        "star4": "45"
      }
    ]
  }
]

const filterResponse = (data, dataFilter = '') => {
  if (dataFilter) {
    let filterArray = [];
    data.forEach((item) => {
      let response = Object.keys(item)
        .filter(key => dataFilter.responseKeys.includes(key))
        .reduce((obj, key) => {
          obj[key] = item[key];
          return obj;
        }, {});
      filterArray.push(response);
    });
    return filterArray;
  }
  return data;
};

console.log(filterResponse(data, dataFilter['webPage1']));

试图根据我的 json 配置过滤我的数据。

预期产出

//webPage1
[{
    "filmName": "Avatar",
    "releaseDate": "2021-09-24"
  },
  {
    "filmName": "Morgan",
    "releaseDate": "2021-03-24"
  }
]

//webPage2
[{
    "releaseDate": "2021-09-24",
    "ratings: [{
    "star2": "23",
    "star3": "56"
  },
  {
    "star2": "23",
    "star3": "56"
  },
  {
    "star2": "23",
    "star3": "56"
  }
]
}, {
  "releaseDate": "2021-03-24",
  "ratings": [{
    "star2": "23",
    "star3": "56"
  }, {
    "star2": "23",
    "star3": "56"
  }, {
    "star2": "23",
    "star3": "56"
  }]
}]

标签: javascriptecmascript-6

解决方案


你试过很好,但你没有实现ratings过滤器......

let data = [{ "filmName": "Avatar", "releaseDate": "2021-09-24", "day": "24", "month": "Sep", "ratings": [{ "star1": "40", "star2": "23", "star3": "56", "star4": "45" }, { "star1": "40", "star2": "23", "star3": "56", "star4": "45" }, { "star1": "40", "star2": "23", "star3": "56", "star4": "45" }] }, { "filmName": "Morgan", "releaseDate": "2021-03-24", "day": "24", "month": "Mar", "ratings": [{ "star1": "40", "star2": "23", "star3": "56", "star4": "45" }, { "star1": "40", "star2": "23", "star3": "56", "star4": "45" }, { "star1": "40", "star2": "23", "star3": "56", "star4": "45" }] }]
let filterResponse = (data, dataFilter) => data.map(v => {
    let o = {}
    dataFilter.forEach(item => o[item] = v[item])
    return o
})

console.log("webPage1", filterResponse(data, ["releaseDate", "filmName"]));
console.log("webPage2", filterResponse(data, ["releaseDate", "ratings"]).map(item => {
    item.ratings = filterResponse(item.ratings, ["star2", "star3"])
    return item
}))


推荐阅读