簡體   English   中英

JavaScript:根據排列順序對數組進行排序?

[英]JavaScript: Sort array based on a permutation order?

我有一個包含三個 colors 數組的 N 元素列表,如下所示:

[
  { id: 1, colors: ['Red', 'Blue', 'White'] },
  { id: 2, colors: ['Red', 'Blue', 'Blue'] },
  { id: 3, colors: ['Red', 'Red', 'White'] },
  { id: 4, colors: ['Red', 'Red', 'Red'] }
]

我想根據這個優先順序對它們進行排序,例如:

[Red,Red,Red]
[Red,Red,X]
[Red,X,Red]
[Red,X,X]
[X,Red,Red]
[X,Red,X]
[X,X,Red]

在“X”表示任何其他顏色的地方不是我指定的顏色,在這個例子中是“紅色”。

因此,對於此示例,預期的 output 將是:

[
  { id: 1, colors: ['Red', 'Red', 'Red'] },
  { id: 2, colors: ['Red', 'Red', 'White'] },
  { id: 3, colors: ['Red', 'Blue', 'White'] },
  { id: 4, colors: ['Red', 'Blue', 'Blue'] }
]

關於如何解決這個問題的任何想法?

我嘗試根據 colors 查找重復項並對父數組進行排序,但我需要考慮優先級順序。

elements.sort((a, b) => {
  const colorDupsA = findDuplicates(a.colors);
  const colorDupsB = findDuplicates(b.colors);
  return colorDupsB.length - colorDupsA.length;
});

或者,使用索引數組srt您可以通過以下方式執行此操作:

 const arr=[ {id: 1,colors: ['Red', 'Blue', 'White']}, {id: 1,colors: ['Red', 'Blue', 'Blue']}, {id: 1,colors: ['Red', 'Red', 'White']}, {id: 1,colors: ['Red', 'Red', 'Red']}]; const srt=arr.map((e,i)=>[i,e.colors.map(c=>c=="Red"?"1":"0").join("")]) console.log(srt.sort((a,b)=>b[1]-a[1]).map(([i])=>arr[i]));

您甚至可以將其簡化為單行:

arr.map((e,i)=>[i,e.colors.map(c=>c=="Red"?"1":"0").join("")])
   .sort((a,b)=>b[1]-a[1]).map(([i])=>arr[i])

因此,您需要遍歷 arrays 並確定一個是紅色的,另一個是紅色的。 如果他們兩者或兩者都不是,那么你移動到下一個並檢查。

 const data = [ { colors: ['Blue', 'Blue', 'Red'] }, { colors: ['Blue', 'Red', 'White'] }, { colors: ['Blue', 'Blue', 'White'] }, { colors: ['Red', 'Blue', 'White'] }, { colors: ['Red', 'Blue', 'Blue'] }, { colors: ['Red', 'Red', 'White'] }, { colors: ['Red', 'Red', 'Red'] } ]; data.sort((a,b) => { const ac = a.colors; const bc = b.colors for (let i=0; i<ac.length; i++){ const check = (ac[i] === bc[i]) || (ac[i];== 'Red' && bc[i];== 'Red')? if (check) continue: return ac[i] === 'Red'; -1; 1; } return 0. }); console.log(data);

如果您必須根據其他 colors 進行排序,則為數組生成“加權值”將是 go 的一種方法

 const data = [ { colors: ['Blue', 'Blue', 'Red'] }, { colors: ['Blue', 'Red', 'White'] }, { colors: ['Blue', 'Blue', 'White'] }, { colors: ['Red', 'Blue', 'White'] }, { colors: ['Red', 'Blue', 'Blue'] }, { colors: ['Red', 'Red', 'White'] }, { colors: ['Red', 'Red', 'Red'] } ]; const values = { Red: 3, Blue: 2, White: 1, }; const weight = arr => +arr.map(c => values[c] || 0).reverse().join(""); data.sort((a, b) => weight(b.colors) - weight(a.colors)); console.log(data);

這是一個可能的解決方案:

  1. 創建一個私有 function getColorScore以根據您的顏色及其在其中的索引的出現來計算colors數組的分數。 這可以使用.reduce來完成
  2. 使用此 function 對對象數組進行排序,其中colors列表中score較高的 object 將是第一個。 這是使用.sort完成的

 const arr = [ { id: 1, colors: ['Red', 'Blue', 'White'] }, { id: 1, colors: ['Red', 'Blue', 'Blue'] }, { id: 1, colors: ['Red', 'Red', 'White'] }, { id: 1, colors: ['Red', 'Red', 'Red'] } ]; const getColorScore = (colors, color) => colors.reduce((acc,item,index) => { acc += item===color? colors.length-index: 0; return acc; }, 0); const sortArrayByColor = (arr,color) => arr.sort((a,b) => getColorScore(b.colors,color)-getColorScore(a.colors,color)) console.log( sortArrayByColor(arr,'Red') );

sort方法中,根據排列順序計算每個 object 的value並比較值。

 const data = [ { colors: ["Blue", "Blue", "Red"] }, { colors: ["Blue", "Red", "White"] }, { colors: ["Blue", "Blue", "White"] }, { colors: ["Red", "Blue", "White"] }, { colors: ["Red", "Blue", "Blue"] }, { colors: ["Red", "Red", "White"] }, { colors: ["Red", "Red", "Red"] }, ]; const getValue = (obj) => obj.colors.reduce((acc, cur) => +(cur === "Red") + acc * 10, 0); data.sort((a, b) => getValue(b) - getValue(a)); console.log(data);

暫無
暫無

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

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