簡體   English   中英

高級對象分類

[英]Advanced object sorting

我正在用力撞牆,試圖解決這個問題...基本上,我有一個結構類似於以下的對象:

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. 具有matchs.title == true的結果是最高的結果。 在此子集中,matches.h1為true表示權重最大(最頂部),其次是頁面副本內的出現次數(matches.copy)。

  2. 具有matchs.h1 == true的結果將在結果視圖中顯示,然后按頁面副本(matches.copy)中出現的次數排序。

  3. matchs.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的元素上.title === false 否則,如果另一個元素具有.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) { ... });很容易 然后將適當的邏輯添加到回調中:如果a <b,則返回-1;如果a> b,則返回1;如果a == b,則返回0。

JavaScript中的對象未排序。 如果需要特定順序,則需要將其轉換為數組:

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

由於對象是通過引用傳遞的,因此您仍然可以使用results[..]訪問對象之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM