当我在元素的第一部分有重复时,我想返回最大的元素。我已对数组进行了排序,它看起来像:
var sortedMyArray = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"];
我的预期结果是:
["4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/35"];
到目前为止我的代码是:
for(var i=0;i<sortedMyArray.length;i++){
for (var k = i + 1; k < sortedMyArray.length; k++) {
if(sortedMyArray[i].split('/')[0] == sortedMyArray[k].split('/')[0]){
console.log('First values of element equal so remove the smallest element');
if(sortedMyArray[i].split('/')[1]<sortedMyArray[k].split('/')[1]){
sortedMyArray.splice(sortedMyArray[i],1);
}
}
}
}
答案 0 :(得分:3)
由于您对数组进行了排序,因此您可以过滤掉具有相同字符串的下一个元素的每个元素,直到'/'
:
result = sortedMyArray.filter( function ( el, i ) {
if ( i + 1 === sortedMyArray.length )
return true;
return el.split( '/' )[ 0 ] !== sortedMyArray[ i + 1 ].split( '/' )[ 0 ];
} );
这假定您的数组已正确排序,因此您始终希望保留最后一个带有每个前缀的条目。为了以防万一,我建议您仔细检查您的排序是否符合/2
和/10
结尾的案例。
答案 1 :(得分:1)
这使用Array.reduce()将每个元素的第一部分和完整元素作为键/值对放入对象中。当存在重复键时,它会比较斜杠后的值以存储较大的值。然后返回数组中的所有值。
var sortedMyArray = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"];
var reduced = Object.values(sortedMyArray.reduce((acc, val) => {
const [ preSlash, postSlash ] = val.split('/');
if (acc[preSlash]) {
const stored = acc[preSlash].slice(acc[preSlash].indexOf('/'));
return postSlash > stored
? Object.assign(acc, { [preSlash]: val })
: acc;
} else {
return Object.assign(acc, { [preSlash]: val });
}
}, {}));
console.log(Object.values(reduced));
答案 2 :(得分:1)
使用Array#reduce
以对象作为累加器来迭代数组。
在每次迭代中,使用分隔符拆分元素,并使用结果的第一个元素作为属性,以便初始化它或将其更新为当前元素。
最后使用Object.values
获取一系列独特元素。
Benchmarking表明这比发布时的其他两种方法都要快。
var sorted = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"];
var unique = sorted.reduce((u, e) => ((u[e.split('/')[0]] = e), u), {});
console.log(Object.values(unique));