我有一个包含最小3 的单个数组,最大5 数组包含对象。我的目标是将这些对象附加到列表中,因此我的结果将包含3,4或5个列表。我试图在一些有点不同寻常的事情中对这些列表进行排序。我想将列表项与其他列表中列表项的位置进行匹配。然后我想把顶部最匹配的列表项和
例如,如果"项目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'}
]
];
匹配的商品会收到一个精彩课程。 "缺口"在没有项目匹配的列表中填充剩余列表项目,这些项目不存在于任何其他列表中。
如何在这个问题上对数组进行排序?
答案 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不稳定。
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;