高级对象排序

Advanced object sorting

本文关键字:排序 对象 高级      更新时间:2023-09-26

我的头撞在墙上试图解决这个问题。。。基本上,我有一个结构类似的对象:

results = {
  1 : {
    url    : '/',
    matches: {
      title : true,
      h1    : false,
      copy  : 2
    }
  },
  2 : {
    url    : '/?id=2',
    matches: {
      title : true,
      h1    : true,
      copy  : 0
    }
  },
  3 : {
    url    : '/id=3',
    matches: {
      title : false,
      h1    : false,
      copy  : 6
    }
  }
}

这是自定义搜索的结果集。我需要结果具有基于对象内匹配的相关性权重。结果应该这样排序:

  1. 具有matches.title==true的结果是最上面的结果。在这个子集中,matches.h1为true的权重最大(最高),其次是页面副本中出现的次数(matches.copy)。

  2. 具有matches.h1==true的结果将显示在结果视图中,按页面副本中出现的次数排序(matches.copy)。

  3. matches.title和matches.h1均为false的结果将在matches.copy上按降序排序。

对于当前的对象结构,这可行吗?还是我需要将其拆分并交叉引用每个子集?啊!时间还早,咖啡不起作用:(


编辑:已将结果集转换为对象数组。新结构:

results = [
  { pageid: 1, url: '/', matches: { title: true, h1: false, copy: 2 } },
  { pageid: 2, url: '/?id=2', matches: { title: true, h1: true, copy: 0 } },
  { pageid: 3, url: '/?id=3', matches: { title: false, h1: false, copy: 6 } }
]

排序仍然在逃避我。我以前做过简单的排序,但没有达到这种程度。我遇到了LINQ,它看起来很有前途,但我没有使用它的经验。不确定这是否是正确的方向。

我建议使用数组,它是为有序列表设计的。

您可以使用.sort并提供自定义搜索功能:http://jsfiddle.net/uR4Jn/2/.

如果另一个元素具有.title === false,则首先尝试向上移动具有.title === true的元素。否则,如果另一个元素具有.h1 === false,则尝试向上移动具有.h1 === true的元素。最后,只需对.copy进行排序。(如果相反,则在前两种情况下向下移动项目。)

var results = [
  {
    url    : '/',
    matches: {
      title : true,
      h1    : false,
      copy  : 2
    }
  },
  {
    url    : '/?id=2',
    matches: {
      title : true,
      h1    : true,
      copy  : 0
    }
  },
  {
    url    : '/id=3',
    matches: {
      title : false,
      h1    : false,
      copy  : 6
    }
  },
  {
    url    : '/id=3',
    matches: {
      title : false,
      h1    : false,
      copy  : 7
    }
  }
];
results = results.sort(function(a, b) {
    return (a.matches.title && !b.matches.title ? -1
         : (!a.matches.title && b.matches.title ? 1
         : (a.matches.h1 && !b.matches.h1 ? -1
         : (!a.matches.h1 && b.matches.h1 ? 1
         : b.matches.copy - a.matches.copy))));
});

通过调用results.sort(function(a, b) { ... });,然后向回调添加适当的逻辑,这很容易实现:如果<b、 如果a>b、 如果a==b,则为0

JavaScript中的对象没有排序。如果你想要一个特定的订单,你需要将其转换为数组:

var resultList = [];
for(var elem in results) {
    resultList.push(results[elem]);
}
resultList.sort(function(a, b) {
    // perform your sorting
});

由于对象是通过引用传递的,因此您仍然可以使用results[..]来访问其中一个对象。