高级对象排序

时间:2012-02-22 15:24:17

标签: javascript sorting object

我正在撞墙试图解决这个问题......基本上,我有一个具有类似结构的物体:

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. 匹配match.title == true的结果是最重要的结果。在这个子集中,matches.h1为true,最重要(最顶层),后面是页面副本中出现的次数(matches.copy)。

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

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

  4. 这可以用当前的对象结构吗?或者我是否需要将其拆分并交叉引用每个子集?尔加!现在这么早,咖啡不起作用:(


    修改 将结果集转换为对象数组。新结构:

    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,看起来很有希望,但我没有使用它的经验。不确定这是否正确。

2 个答案:

答案 0 :(得分:5)

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

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

如果另一个元素具有.title === true,首先尝试向上移动具有.title === false的元素。否则,如果其他元素具有.h1 === true,请尝试向上移动具有.h1 === false的元素。最后,只需按.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))));
});

答案 1 :(得分:1)

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

JavaScript中的对象未订购。如果需要特定订单,则需要将其转换为数组:

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

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