我真的希望你能帮助我,我有一个对象数组,我需要一个算法或一个指向要阅读的东西的指针,以便根据它们与邻居的相似性对它们进行排序。
例如
[
{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/