javascript - 按与邻居的相似度排序的对象数组

标签 javascript node.js algorithm computer-science

我真的希望你能帮助我,我有一个对象数组,我需要一个算法或一个指向要阅读的东西的指针,以便根据它们与邻居的相似性对它们进行排序。

例如

[ 
  {a:12,b: 7,c: 5}, 
  {a: 5,b: 5,c: 5}, 
  {a: 3,b: 3,c: 3}, 
  {a: 5,b: 7,c: 5},
  {a:12,b: 7,c: 5}
]

成为

[
  {a: 5,b: 5,c: 5},
  {a: 5,b: 7,c: 5},
  {a:12,b: 7,c: 5}, 
  {a:12,b: 7,c: 5}, 
  {a: 3,b: 3,c: 3},
]

我这里有一个 REPL...

https://repl.it/@idrise/ThoseWellmadeMonitors

我用暴力破解了它,但它没有得到最好的分数,而且它在大阵列上花费了很长时间。

分数是这样计算的,分数越高越好!

function scoreArray(array) {
  let score = 0;
  for (let f = 1; f < array.length; f++) {
    score += howSimilarAreObjects(array[f - 1], array[f]);
  }
  return score;
}

function howSimilarAreObjects(object1, object2) {
  let score = 0;
  Object.keys(object1).forEach(curValue => {
    if (object1[curValue] === object2[curValue]) {
      score++;
    }
  });
  return score;
}

非常感谢任何帮助,

idris

最佳答案

您可以将每个元素相互比较并获得两个对象之间的相似性。然后取组,先得到相似度最高的对象,然后得到相似度较低的对象。通过将它们推送到结果集,按已看到的对象过滤数组。

const similar = (a, b) => Object.keys(a).filter(k => a[k] === b[k]).length;

var array = [{ a: 12, b: 7, c: 5}, { a: 5, b: 5, c: 5}, { a: 3, b: 3, c: 3}, { a: 5, b: 7, c: 5}, { a: 12, b: 7, c: 5}],
    groups = {},
    used = new Set,
    result = [];

array.forEach((a, i) => 
    array
        .slice(i + 1)
        .forEach(b => (s => (groups[s] = groups[s] || []).push(a, b))(similar(a, b))));

Object
    .keys(groups)
    .reverse()
    .forEach(k => result.push(...groups[k].filter(o => !used.has(o) && used.add(o))));

console.log(result);
console.log(groups);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 按与邻居的相似度排序的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52824214/

相关文章:

json - 使用世界在线天气

java - 用散列解决树同构

javascript - AngularJS:二进制图像未加载

javascript - Chrome 在 window.history.back() 上强制刷新页面

javascript - 如何停止四十个循环中的循环

arrays - 塔高之间的最小差异?

algorithm - 在不使用 64 位 int 的情况下将两个 32 位数字相乘

javascript - 旋转椭圆形 SVG 对象

javascript - 从 Chrome 扩展弹出窗口重定向

javascript - Express 和 Jade 中内联 jade.render() ?