繁体   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