对公共属性数组进行排序


Sorting common array of attributes

我正在努力解决一个数组问题,我相信这个问题以前已经解决了。 我能想到的最好的类比是产品比较功能,其中选择了 2-3 种产品并列出它们的特性供用户比较。

我有 2-3 个特征数组。 数组可以具有相同的特征。我需要并排显示数组表,其中元素按"最常见"排序。因此,如果所有三个数组都具有相同的特征,它将位于顶部。 然后列出两个相似的特征,等等。 如果两个数组共享一个特征,则第三个数组将有一个空白单元格。

后端是用 PHP 编写的。前端是Javascript。 我正在使用下划线实现其他一些功能,因此它的数组函数可用。

只是无法理解我必须做的事情的组合才能完成这项工作! 任何帮助将不胜感激!

我设法找到了一个我认为涵盖这个问题的解决方案,根据mainegreen的建议,使用二级结构来记录每个类别的频率,以及一个自定义排序函数,使用该频率数组的值进行比较。下面的示例实现;

function getCategories(products) {
var categories = [], frequency = {};
for (var i = 0; i < products.length; i++) {
    for (var c in products[i]) {
        if (products[i].hasOwnProperty(c)) {
            if (frequency.hasOwnProperty(c)) {
                frequency[c]++;
            } else {
                categories.push(c);
                frequency[c] = 1;
            }
        }
    }
}
categories.sort(function (a,b) { return frequency[b]-frequency[a]; });
return categories;
}

这将适用于以下一系列产品;

var products = [
    {
        cat1: 'val1',
        cat2: 'val1',
    }, {
        cat2: 'val2',
        cat3: 'val2',
    }, {
        cat2: 'val3',
        cat3: 'val3',
        cat4: 'val3',
    }
];

如果我理解正确,我不确定我是否理解正确,但是如果您尝试对多个数组中的项目进行排序,以便对每个数组的"特征"进行排序,其中共享最多的列在顶部,那么您是否可以没有用于实现共享特征计数的辅助数组?因此,您将遍历第一组数组,并在找到每个特征时,递增该特征的计数器。

然后,当您在显示例程上时,您会在用于统计特征计数的数组上有一个循环例程吗?

你可以合并产品中的array_keys()进行比较,然后循环访问键(=="特征"),并将它们分类为三个新数组("共享"、"通用"、"不常见")。

有了该数组,重建产品数组,为未使用的键留下空字段。