Javascript:对数组排序
我需要根据与沙龙最有共同利益的人来分类。兴趣匹配最多的人应该在最上面。getSortedList函数,用于对人员列表进行排序-与“sharon”对象3匹配的兴趣最相似的人应排在首位Javascript:对数组排序,javascript,Javascript,我需要根据与沙龙最有共同利益的人来分类。兴趣匹配最多的人应该在最上面。getSortedList函数,用于对人员列表进行排序-与“sharon”对象3匹配的兴趣最相似的人应排在首位 const interestList = [ "gaming", "driving", "football", "fishing", "painting", "cooking", "singing", "shopping", "running", "clubbing" ];
const interestList = [
"gaming",
"driving",
"football",
"fishing",
"painting",
"cooking",
"singing",
"shopping",
"running",
"clubbing"
];
const people = [
{ name: "Ahmad", interests: ["shopping", "painting", "cooking"] },
{ name: "Betty", interests: ["running", "painting", "football"] },
{ name: "Charlie", interests: ["gaming", "football", "painting"] },
{ name: "Diana", interests: ["fishing", "singing", "driving"] },
{ name: "Ethan", interests: ["gaming", "clubbing", "cooking"] },
{ name: "Farhan", interests: ["cooking", "driving", "fishing"] },
{ name: "Gwen", interests: ["singing", "fishing", "gaming"] },
{ name: "Helen", interests: ["football", "clubbing", "shopping"] },
{ name: "Imelda", interests: ["painting", "running", "football"] },
{ name: "Josef", interests: ["shopping", "running", "cooking"] },
{ name: "Khan", interests: ["fishing", "running", "clubbing"] },
{ name: "Lionel", interests: ["gaming", "singing", "driving"] }
];
const sharon = {
name: "Sharon",
interests: ["football", "painting", "gaming"]
};
function getSortedList() {
let output = people.slice();
return person;
}
function printPeople() {
let list = getSortedList();
list.unshift(sharon);
list.forEach(person => {
person.interest1 = person.interests[0];
person.interest2 = person.interests[1];
person.interest3 = person.interests[2];
delete person.interests;
});
console.log("Friend Matching Script Output:");
console.table(list);
console.table(getSortedList());
}
printPeople();
你可以试试这样的。如果需要将排序修改为超出计数范围,可以调整排序方法
let people = [
{ name: "Ahmad", interests: ["shopping", "painting", "cooking"] },
{ name: "Betty", interests: ["running", "painting", "football"] },
{ name: "Charlie", interests: ["gaming", "football", "painting"] },
{ name: "Diana", interests: ["fishing", "singing", "driving"] },
{ name: "Ethan", interests: ["gaming", "clubbing", "cooking"] },
{ name: "Farhan", interests: ["cooking", "driving", "fishing"] },
{ name: "Gwen", interests: ["singing", "fishing", "gaming"] },
{ name: "Helen", interests: ["football", "clubbing", "shopping"] },
{ name: "Imelda", interests: ["painting", "running", "football"] },
{ name: "Josef", interests: ["shopping", "running", "cooking"] },
{ name: "Khan", interests: ["fishing", "running", "clubbing"] },
{ name: "Lionel", interests: ["gaming", "singing", "driving"] }
];
const sharon = {
name: "Sharon",
interests: ["football", "painting", "gaming"]
};
people.forEach((person, index)=> {
let count = 0;
person.interests.forEach(int => {
sharon.interests.forEach(interest => {
if(int === interest) {
count++
people[index]['count'] = count;
}
})
})
})
people.sort((a,b) => {
if(a.count >= b.count) {
return -1;
} else {
return 1;
}
})
通常,最简单的排序方法是当它们是数字形式时。目前,只有数组和对象形式的数据,很难单独排序。相反,由于您希望根据两个人之间的共同兴趣的数量进行排序,我们可以使用此数字来帮助我们对对象数组进行排序 因此,解决问题的第一步是找出一种方法,找出一个对象与另一个对象之间的重叠兴趣的数量。这可以通过以下方法实现:
const get_overlapping = interests =>
sharon.interests.filter(hobby => interests.includes(hobby)).length;
上面的方法将使用.filter遍历sharon的兴趣,并且只保留那些出现在传入兴趣数组中的.include。当.filter返回一个与sharon重叠的兴趣数组时,我们可以简单地得到这个数组的.length来找到重叠兴趣的数量
下一步是现在使用我们的get_重叠方法对列表进行排序。Javascript提供了一个方法,我们可以在其中向它提供一个函数,该函数定义了它应该如何排序
如果提供的函数有两个参数a和b,这两个参数都表示数组中的元素,返回的数字都小于0,那么它将使a位于数组中的b之前,如果返回的数字为0,那么a和b将保持不变,如果返回的数字大于0,那么b将位于a之前。使用此想法,我们可以使用以下方法对人员数组进行排序:
get_overlapping(b) - get_overlapping(a)
其中b现在表示数组中一个对象的兴趣数组,a表示数组中另一个对象的兴趣数组
利用这个想法,我们可以在getSortedList方法中使用:
康斯特人=[
{姓名:艾哈迈德,兴趣:[购物、绘画、烹饪]},
{姓名:贝蒂,兴趣:[跑步、绘画、足球]},
{姓名:查理,兴趣:[游戏、足球、绘画]},
{姓名:戴安娜,兴趣:[钓鱼、唱歌、开车]},
{姓名:Ethan,兴趣:[赌博、夜总会、烹饪]},
{姓名:Farhan,兴趣:[烹饪、驾驶、钓鱼]},
{姓名:格温,兴趣:[唱歌、钓鱼、游戏]},
{姓名:海伦,兴趣:[足球、俱乐部、购物]},
{姓名:伊梅尔达,兴趣:[绘画、跑步、足球]},
{姓名:约瑟夫,兴趣:[购物、跑步、烹饪]},
{姓名:汗,兴趣:[钓鱼、跑步、夜总会]},
{姓名:莱昂内尔,兴趣:[游戏、唱歌、开车]}
];
康斯特·沙龙={
姓名:沙龙,,
兴趣:[足球、绘画、游戏]
};
const get_overlapping=兴趣=>
sharon.interests.filteri=>interests.includesi.length;
常量getSortedList==>{
const output=people.slice;//复制人员,这样我们就不会修改人员数组
output.sort{interests:a},{interests:b}=>get_overlappingb-get_overlappinga;
返回输出;//返回排序数组
}
console.loggetSortedList 确定重叠兴趣的计数,然后应用排序
people.map(item => {
let count = 0;
sharon.interests.forEach(interest => {if (item.interests.lastIndexOf(interest) > -1) ++count});
item.counts = count;
return item;
}).sort((a,b) => a.counts < b.counts ? 1 : (a.counts > b.counts ? -1 : 0))
看看下面写代码的地方-那是你写代码的地方,然后,如果你的代码不起作用,你可以问为什么。。。因此,它不是一个代码编写服务,希望您尝试解决您的问题first@JaromandaX对不起,伙计,我是编程和堆栈溢出方面的新手。我只是不知道逻辑,我一直在尝试循环方式并将其推入数组。但是……我很困惑,如何将它与其他数组对象进行比较。您是否尝试过这段代码?它看起来像是在内部循环中声明count,这意味着每次迭代都会重写它,它的值永远不会超过1。这将是一个问题。我将更新代码以将计数移动到人员循环下。