Javascript:对数组排序

Javascript:对数组排序,javascript,Javascript,我需要根据与沙龙最有共同利益的人来分类。兴趣匹配最多的人应该在最上面。getSortedList函数,用于对人员列表进行排序-与“sharon”对象3匹配的兴趣最相似的人应排在首位 const interestList = [ "gaming", "driving", "football", "fishing", "painting", "cooking", "singing", "shopping", "running", "clubbing" ];

我需要根据与沙龙最有共同利益的人来分类。兴趣匹配最多的人应该在最上面。getSortedList函数,用于对人员列表进行排序-与“sharon”对象3匹配的兴趣最相似的人应排在首位

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。这将是一个问题。我将更新代码以将计数移动到人员循环下。