Javascript - 在对象数组(矩阵)中查找不同的属性
Javascript - Finding distinct properties in array of objects (matrix)
背景:预处理代码将运行对大量数据提取需要在图表上显示的属性。该图为平行坐标图。它会在浏览器中运行。
代码段:提取更改的属性和相关类别
我的代码片段正确输出了答案,但效率不高
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)
这输出正确。寻找更有效的方法。
我假设通过 changed 我们包含了在某一点存在而不在另一点存在的属性。这似乎是在更改中包含属性 Dim_D
和 Dim_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]
}
}
}
背景:预处理代码将运行对大量数据提取需要在图表上显示的属性。该图为平行坐标图。它会在浏览器中运行。
代码段:提取更改的属性和相关类别
我的代码片段正确输出了答案,但效率不高
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)
这输出正确。寻找更有效的方法。
我假设通过 changed 我们包含了在某一点存在而不在另一点存在的属性。这似乎是在更改中包含属性 Dim_D
和 Dim_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]
}
}
}