javascript - 将对象列表转换为嵌套的对象列表 javascript

标签 javascript arrays node.js json

我是 JS 的新手.我有一个如下所示的对象列表,

var a = [
  {
    wa_id: 1,
    wa_property_id: 'p1',
    wa_view_name: 'ram'
  },
  {
    wa_id: 1,
    wa_property_id: 'p1',
    wa_view_name: 'sam'
  },
  {
    wa_id: 1,
    wa_property_id: 'p2',
    wa_view_name: 'kam'
  },
  {
    wa_id: 2,
    wa_property_id: 'p5',
    wa_view_name: 'pri'
  },
   {
    wa_id: 1,
    wa_property_id: 'p3',
    wa_view_name: 'ste',
  },
]

我想遍历这些对象并创建一个新的单独对象。
我想要如下所需的输出

所需输出:
  {
        "1": {
            "p1": ["ram", "sam"],
            "p2": ["kam"],
            "p3": ["ste"]
        },
        "2": {
            "p5": ["pri"]
        }
    }

这是我尝试过的代码,

var a = [{
    wa_id: 1,
    wa_property_id: 'p1',
    wa_view_name: 'ram'
  },
  {
    wa_id: 1,
    wa_property_id: 'p1',
    wa_view_name: 'sam'
  },
  {
    wa_id: 1,
    wa_property_id: 'p2',
    wa_view_name: 'kam'
  },
  {
    wa_id: 2,
    wa_property_id: 'p5',
    wa_view_name: 'pri'
  },
  {
    wa_id: 1,
    wa_property_id: 'p3',
    wa_view_name: 'ste',
  },

]
temp_obj = {}
temp_list = []
for (var j = 0; j < a.length; j++) {
  temp_list.push(a[j].wa_property_id)
}
temp_list.splice(0, temp_list.length, ...(new Set(temp_list)))
// Property ID List
console.log(temp_list)
// Output: ["p1","p2","p5","p3"]

properyViewObj = {}
temp_list2 = []
for (var j = 0; j < temp_list.length; j++) {
  for (var k = 0; k < a.length; k++) {
    if (a[k].wa_property_id == temp_list[j]) {
      temp_list2.push(a[k].wa_view_name)
    }
  }
  properyViewObj[temp_list[j]] = temp_list2
  temp_list2 = []
}
// Property with Viewnames
console.log(properyViewObj)
// Output: {p1: ["ram","sam"],p2: ["kam"],p5: ["pri"],p3: ["ste"]}

var wa_list = []
for (var j = 0; j < a.length; j++) {
  wa_list.push(a[j].wa_id)
}
wa_list.splice(0, wa_list.length, ...(new Set(wa_list)))
// Wa_id List
console.log(wa_list)
// Output: [1,2]
// How to make the Next Step
var output = {}
var tem = []
for (var j = 0; j < wa_list.length; j++) {
  for (var k = 0; k < a.length; k++) {
    if (a[k].wa_id == wa_list[j]) {
      console.log(a[k].wa_property_id)

    }
  }
}

最佳答案

您可以结合使用 reduce 和 spread 来计算您的对象。

const data = a.reduce((lkp, obj, i) => {
  const {wa_id, wa_property_id, wa_view_name} = obj;
  return {
    ...lkp,
    [wa_id]: {
      ...lkp[wa_id],
      [wa_property_id]: [...((lkp[wa_id] || {})[wa_property_id] || []), wa_view_name]
    }
  }
}, {})

console.log (data)
<script>
  var a = [{
      wa_id: 1,
      wa_property_id: 'p1',
      wa_view_name: 'ram'
    },
    {
      wa_id: 1,
      wa_property_id: 'p1',
      wa_view_name: 'sam'
    },
    {
      wa_id: 1,
      wa_property_id: 'p2',
      wa_view_name: 'kam'
    },
    {
      wa_id: 2,
      wa_property_id: 'p5',
      wa_view_name: 'pri'
    },
    {
      wa_id: 1,
      wa_property_id: 'p3',
      wa_view_name: 'ste',
    },
  ]
</script>

关于javascript - 将对象列表转换为嵌套的对象列表 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990636/

相关文章:

php - 密码重置后删除该用户的所有 session cookie

node.js - Travis CI,使用 mocha 进行 npm 测试时出错

javascript - 在单独的 Canvas 中渲染多个视频

javascript - JavaScript “ended”函数无法正常运行

javascript - 如何将文本从 <output> 复制到剪贴板?

javascript - Lodash/JS - 将 _.find 语句转换为 _.forEach

c# - 如何使用 C# 将数组的元素插入到 SQL Server 数据库中?

javascript - 数组和某些数组空白的数组总和

php - 无循环获取数组中 N 位置的元素

node.js - 具有粘性 session 的 Nodejs 集群