[英]Changing the order of an array based on another with javascript sort
[英]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);
这是一个可能的解决方案:
getColorScore
以根据您的颜色及其在其中的索引的出现来计算colors
数组的分数。 这可以使用.reduce
来完成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.