【问题标题】:Javascript - Finding distinct properties in array of objects (matrix)Javascript - 在对象数组(矩阵)中查找不同的属性
【发布时间】:2020-08-15 17:37:38
【问题描述】:

背景:预处理代码将在大量数据上运行,以提取需要在图表上显示的属性。该图表是平行坐标图表。它将在浏览器中运行。

片段:提取更改的属性和相关类别

我的 sn-p 正确输出答案,但效率不高

var all = [
    {
      Dim_A: { v: '0', category: 'Window' },
      Dim_B: { v: '-1', category: 'Wall' },
      Dim_C: { v: '0', category: 'Wall' },
      Dim_D: { v: '0', category: 'Exterior Wall' }
    },
    {
      Dim_A: { v: '0', category: 'Window' },
      Dim_B: { v: '2', category: 'Wall' },
      Dim_C: { v: '1', category: 'Wall' },
      Dim_D: { v: '0', category: 'Exterior Wall' }
    },
    {
      Dim_A: { v: '0', category: 'Window' },
      Dim_B: { v: '-1', category: 'Wall' },
      Dim_C: { v: '0', category: 'Wall' }
    },
    {
      Dim_A: { v: '0', category: 'Window' },
      Dim_B: { v: '-1', category: 'Wall' },
      Dim_C: { v: '0', category: 'Wall' },
      Dim_E: { v: '0', category: 'Exterior Wall' }
    }
  ]

  if (all.length < 2) {
    throw 'need at least 2'
  }

  let distinctDims = new Map()
  for (let i = 0; i < all.length - 1; i++) {
    for (let j = i + 1; j < all.length; j++) {
      if (i === j) {
        continue
      }
      let a = all[i]
      let b = all[j]
      for (let pa in a) {
        if (!a[pa] || !b[pa] || a[pa].v !== b[pa].v)
          distinctDims[pa] = { category: a[pa].category }
      }
      for (let pb in b) {
        if (!a[pb] || !b[pb] || a[pb].v !== b[pb].v)
          distinctDims[pb] = { category: b[pb].category }
      }
    }
  }

  console.log(distinctDims)

这输出正确。寻找更有效的方法。

【问题讨论】:

  • "Also on CodePen" 更好的是,使用 Stack Snippets([&lt;&gt;] 工具栏按钮; here's how to do one)。
  • “正在寻找一种在比较图表上显示数据之前准备数据的有效方法” 准备它如何?你需要对它做什么?您是说您显示的代码正确地完成了任务,但您认为它效率低下并想要更好的方法?
  • @t-j-crowder - 可以,但对大量数据有好处
  • “提取已更改的属性” 是什么意思?在这种情况下“distinct”是什么意思?
  • 通过 changed 我们是否包含存在于一个元素中而不存在于另一个元素中的属性?这似乎是在更改中包含属性Dim_DDim_E 的基础?

标签: javascript algorithm columnsorting


【解决方案1】:

我假设通过 changed 我们包含存在于某一点而不存在于另一点的属性。这似乎是在更改中包含属性Dim_DDim_E 的基础。如果我的假设是正确的,那么一个循环就足以找到更改。有三种可能的更改情况:

  • all[0] 处的值从原始值更改
  • all[0] 中存在一个值,但稍后不再存在
  • all[0] 中不存在值,但稍后会出现
if (all.length < 2) {
  throw 'need at least 2'
}

const prevDims = all[0]
const distinctDims = new Map()

for (let i = 1; i < all.length; i++) {
  const currentDims = all[i];

  for (const key in currentDims) {
    if (!distinctDims[key]) {
      // add to distinctDims either if value changed, or if it was not present previously 
      if (!prevDims[key] || currentDims[key].v !== prevDims[key].v) {
          distinctDims[key] = { 
            category: currentDims[key].category 
          }
      }
    }
  }


  // Check for dimensions that existed previously but not currently
  for (const key in prevDims) {
    if (!distinctDims[key] && !currentDims[key]) {
      distinctDims[key] = { category: prevDims[key].category }
      delete prevDims[key]
    }
  }
}

【讨论】:

  • 或者一个属性同时存在,但是值改变了。太好了!
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2021-06-25
相关资源
最近更新 更多