按匹配最多的列表项排序列表

时间:2016-07-22 08:39:33

标签: javascript jquery arrays list sorting

我有一个包含最小3 的单个数组,最大5 数组包含对象。我的目标是将这些对象附加到列表中,因此我的结果将包含3,4或5个列表。我试图在一些有点不同寻常的事情中对这些列表进行排序。我想将列表项与其他列表中列表项的位置进行匹配。然后我想把顶部最匹配的列表项和 匹配项列入。 列表始终包含10个列表项。

例如,如果"项目3"存在于所有五个列表中,"项目3"被移动到列表中的所有列表的位置1。如果"项目21"存在于三个列表中,并且在三个以上列表中不存在其他列表项,"项目21和#34;被移动到包含"项目21和#34;的所有列表中的位置2,依此类推。

所有列表项都是可以通过id匹配的对象。我的数组可能如下所示:

var listsToSort = [
  [
      {id: 1, name: 'Item 1'},
      {id: 3, name: 'Item 3'},
      {id: 7, name: 'Item 7'},
      {id: 8, name: 'Item 8'},
      {id: 9, name: 'Item 9'},
      {id: 11, name: 'Item 11'},
      {id: 12, name: 'Item 12'},
      {id: 16, name: 'Item 16'},
      {id: 18, name: 'Item 18'},
      {id: 19, name: 'Item 19'}
  ],
  [
      {id: 2, name: 'Item 2'},
      {id: 3, name: 'Item 3'},
      {id: 5, name: 'Item 5'},
      {id: 12, name: 'Item 12'},
      {id: 14, name: 'Item 14'},
      {id: 15, name: 'Item 15'},
      {id: 16, name: 'Item 16'},
      {id: 18, name: 'Item 18'},
      {id: 21, name: 'Item 21'},
      {id: 23, name: 'Item 23'}
  ],
  [
      {id: 3, name: 'Item 3'},
      {id: 4, name: 'Item 4'},
      {id: 5, name: 'Item 5'},
      {id: 6, name: 'Item 6'},
      {id: 9, name: 'Item 9'},
      {id: 15, name: 'Item 15'},
      {id: 18, name: 'Item 18'},
      {id: 20, name: 'Item 20'},
      {id: 21, name: 'Item 21'},
      {id: 22, name: 'Item 22'}
  ],
  [
      {id: 3, name: 'Item 3'},
      {id: 9, name: 'Item 9'},
      {id: 10, name: 'Item 10'},
      {id: 16, name: 'Item 16'},
      {id: 18, name: 'Item 18'},
      {id: 22, name: 'Item 22'},
      {id: 23, name: 'Item 23'},
      {id: 24, name: 'Item 24'},
      {id: 26, name: 'Item 26'},
      {id: 28, name: 'Item 28'}
  ],
  [
      {id: 3, name: 'Item 3'},
      {id: 9, name: 'Item 9'},
      {id: 11, name: 'Item 11'},
      {id: 13, name: 'Item 13'},
      {id: 15, name: 'Item 15'},
      {id: 16, name: 'Item 16'},
      {id: 18, name: 'Item 18'},
      {id: 25, name: 'Item 25'},
      {id: 27, name: 'Item 27'},
      {id: 29, name: 'Item 29'}
  ]
 ];

此示例数组的结果在排序时将如下所示:example of sorted array

匹配的商品会收到一个精彩课程。 "缺口"在没有项目匹配的列表中填充剩余列表项目,这些项目不存在于任何其他列表中。

因此,为了澄清,匹配的项目被放置在所有列表的某些列表位置。 example with legend

如何在这个问题上对数组进行排序?

FIDDLE

1 个答案:

答案 0 :(得分:4)

此提案使用排序对象和对每个单个对象的引用,以供稍后用于填充数组的引用。这是通过使用已排序的引用完成的,然后插入一个对象if,如果不是,则插入null

为了维持正确的顺序,未填充的空白填充了索引10或更高的对象。当填充索引10上的所有间隙时,数组的长度设置为10并返回。

raw array before moving values                                      moving values

    0       1       2       3       4                                   4 
------  ------  ------  ------  ------                              ------
    3       3       3       3       3 fixed part with values            3 
   18      18      18      18      18                                  18
    9    null       9       9       9                                   9
   16      16    null      16      16                                  16
 null      15      15    null      15                                  15
 null       5       5    null    null                                null <--
   11    null    null    null      11                                  11   |
   12      12    null    null    null                                null <----
 null      21      21    null    null                                null <------
 null    null      22      22    null                                null <--------
 ------------------------------------                               -----   | | | |
 null      23    null      23    null variable part to fill above    null   | | | |
    1    null    null    null    null                                null   | | | |
 null       2    null    null    null                                null   | | | |
 null    null       4    null    null                                null   | | | |
 null    null       6    null    null                                null   | | | |
    7    null    null    null    null                                null   | | | |
    8    null    null    null    null                                null   | | | |
 null    null    null      10    null                                null   | | | |
 null    null    null    null      13                                  13 --- | | |
 null      14    null    null    null                                null     | | |
   19    null    null    null    null                                null     | | |
 null    null      20    null    null                                null     | | |
 null    null    null      24    null                                null     | | |
 null    null    null    null      25                                  25 ----- | |
 null    null    null      26    null                                null       | |
 null    null    null    null      27                                  27-------- |
 null    null    null      28    null                                null         |
 null    null    null    null      29                                  29 ---------

此解决方案不能提供稳定的结果,因为对于具有相同计数的对象,sort oder不稳定。

&#13;
&#13;
var listsToSort = [[{ id: 1, name: 'Item 1' }, { id: 3, name: 'Item 3' }, { id: 7, name: 'Item 7' }, { id: 8, name: 'Item 8' }, { id: 9, name: 'Item 9' }, { id: 11, name: 'Item 11' }, { id: 12, name: 'Item 12' }, { id: 16, name: 'Item 16' }, { id: 18, name: 'Item 18' }, { id: 19, name: 'Item 19' }], [{ id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' }, { id: 5, name: 'Item 5' }, { id: 12, name: 'Item 12' }, { id: 14, name: 'Item 14' }, { id: 15, name: 'Item 15' }, { id: 16, name: 'Item 16' }, { id: 18, name: 'Item 18' }, { id: 21, name: 'Item 21' }, { id: 23, name: 'Item 23' }], [{ id: 3, name: 'Item 3' }, { id: 4, name: 'Item 4' }, { id: 5, name: 'Item 5' }, { id: 6, name: 'Item 6' }, { id: 9, name: 'Item 9' }, { id: 15, name: 'Item 15' }, { id: 18, name: 'Item 18' }, { id: 20, name: 'Item 20' }, { id: 21, name: 'Item 21' }, { id: 22, name: 'Item 22' }], [{ id: 3, name: 'Item 3' }, { id: 9, name: 'Item 9' }, { id: 10, name: 'Item 10' }, { id: 16, name: 'Item 16' }, { id: 18, name: 'Item 18' }, { id: 22, name: 'Item 22' }, { id: 23, name: 'Item 23' }, { id: 24, name: 'Item 24' }, { id: 26, name: 'Item 26' }, { id: 28, name: 'Item 28' }], [{ id: 3, name: 'Item 3' }, { id: 9, name: 'Item 9' }, { id: 11, name: 'Item 11' }, { id: 13, name: 'Item 13' }, { id: 15, name: 'Item 15' }, { id: 16, name: 'Item 16' }, { id: 18, name: 'Item 18' }, { id: 25, name: 'Item 25' }, { id: 27, name: 'Item 27' }, { id: 29, name: 'Item 29' }]],
    count = Object.create(null),
    countKeys,
    newList, 
    reference;

reference = listsToSort.map(function (a) {
    var o = Object.create(null);
    a.forEach(function (b) {
        count[b.id] = (count[b.id] || 0) + 1;
        o[b.id] = b;
    });
    return o;
});
countKeys = Object.keys(count);
countKeys.sort(function (a, b) { return count[b] - count[a]; });
newList = reference.map(function (a) {
    var temp = countKeys.map(function (k) {
            return a[k] || null;
        }),
        i = 0, j = 10;

    while (i < 10) {
        if (!temp[i]) {
            while (!temp[j]) {
                j++;
            }
            temp[i] = temp[j];
            j++;
        }
        i++;
    }
    temp.length = 10;
    return temp;
});

console.log(newList);
&#13;
&#13;
&#13;