javascript - 如何过滤具有多个层的对象

标签 javascript javascript-objects

我有一个历史对象,其中包含某个范围内每个日期的值:

response = {
          2019-09-13: {logged-in: 3, clicked-something: 15}
          2019-09-14: {logged-in: 0, clicked-something: 0}
          2019-09-15: {logged-in: 0, clicked-something: 0}
          2019-09-16: {logged-in: 0, clicked-something: 0}
          2019-09-17: {logged-in: 0, clicked-something: 0}
          2019-09-18: {logged-in: 2, clicked-something: 24}
          2019-09-19: {logged-in: 7, clicked-something: 36}
          }

我只需要其中一个属性,因此尝试将对象过滤为:

          2019-09-13: {clicked-something: 15}
          2019-09-14: {clicked-something: 0}
          2019-09-15: {clicked-something: 0}
          2019-09-16: {clicked-something: 0}
          2019-09-17: {clicked-something: 0}
          2019-09-18: {clicked-something: 24}
          2019-09-19: {clicked-something: 36}
          }

我尝试给出以下方法来解决这个问题:

const data = {
  "2019-09-13": { "logged-in": 3, "clicked-something": 15 },
  "2019-09-14": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-15": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-16": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-17": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-18": { "logged-in": 2, "clicked-something": 24 },
  "2019-09-19": { "logged-in": 7, "clicked-something": 36 }
};

const allowed = ["clicked-something"]

const result = Object.values(data).map(item => {
  return Object.keys(item)
    .filter(key => allowed.includes(key))
    .reduce((obj, key) => {
      obj[key] = item[key]
      return obj
    }, {})
})

console.log(result)

它完成了工作,但给了我一个数组

编辑:我使用 JavaScript: filter() for Objects 构建了我的解决方案。这里的问题是更改响应对象的日期键。另外,在某些情况下,我可能需要从 5 个中过滤 3 个,等等。

最佳答案

.reduce Object.entries

const response = {
  "2019-09-13": { "logged-in": 3, "clicked-something": 15 },
  "2019-09-14": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-15": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-16": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-17": { "logged-in": 0, "clicked-something": 0 },
  "2019-09-18": { "logged-in": 2, "clicked-something": 24 },
  "2019-09-19": { "logged-in": 7, "clicked-something": 36 }
};

const allowed = ["clicked-something"];

const result = Object.entries(response).reduce((acc, [key, value]) => {
  acc[key] = allowed.reduce((ac, k) => {
    ac[k] = value[k];
    return ac;
  }, {});
  return acc;
}, {});

console.log(result);

关于javascript - 如何过滤具有多个层的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58013936/

相关文章:

javascript - nodeJS - 我如何连接 MySQL 并在本地主机中显示结果

javascript - 使用 JavaScript 根据屏幕尺寸更改链接所指向的位置

javascript - 井字游戏 : Checking Empty Squares

javascript - Google Analytics 的这个正则表达式实际上有什么作用吗?

javascript - 重新排列 javascript 对象结构

function - 将对象传递给 javascript 函数

javascript - 如何在plupload中定义过滤器

JavaScript 未定义函数外部 JavaScript 文件

javascript - 将 String 转换为 JavaScript 中已声明的对象?

javascript - 减少大数组JS中对象中的数组