2014-11-28 3 views
2

그래서이 문제를 해결하려고합니다.여러 기준으로 순위를 지정하여 컬렉션을 정렬하십시오.

우리는 다음과 같이 하나 개의 마스터 배열과 약간의 부하 배열이 있습니다

var master = [3, 2, 2, 4, 15, 8]; 
var minions = [ 
    { 
    id : "Minion1", 
    imitation : [2, 1, 0, 3, 11, 5], 
    }, 
    { 
    id : "Minion2", 
    imitation : [1, 3, 2, 1, 12, 7], 
    }, 
    { 
    id : "Minion3", 
    imitation : [4, 3, 1, 1, 11, 6], 
    } 
]; 

은 이제 부하가 마스터를 모방하려고한다고 가정합시다. 그리고 우리는 누가 더 나은 점수를 주 었는지 알 필요가 있습니다.

제한 : 은 - 부하 의 숫자가있을 수 있습니다 - 우리는 단지 숫자 값 비교 - 항상 같은


을 유지 배열의 숫자의 금액은 그래서 나는이 논리를 내놓았다 :

  1. 마스터의 해당 숫자에서 미니온 배열의 각 숫자를 빼고 이것의 절대 값을 얻습니다. 왜냐하면 마스터가 첫 번째 숫자 3을 가졌기 때문에, 미니언 1은 숫자 2를 가지고 미니언 3은 숫자 4를 갖기 때문입니다. 미니언 1과 미니언 3은 똑같이 마스터로부터 멀리 떨어져 있습니다.

  2. 각 미니언의 절대 값을 배열에 푸시합니다.

  3. 배열의 절대 값을 비교하고 배열의 각 숫자에 대해 미니언을 정렬합니다. 마스터 등 아마 어떤 [0]

    • Minion1 [0]
    • Minion3 [0]
    • Minion2 [0]은 각각의 수에 대한 부하에
  4. 할당 포인트 배열은 서로에 비례하여 위치에 따라 다릅니다. 마스터 [0]에 대한

    • Minion1 [0] +3 점
    • Minion3 [0] +2 점
    • Minion2 [0] +1 점
  5. 합계에게 포인트 미니언 배열의 각 숫자. 지금 더 나은 모방


을 총액을 비교하고 CONSOLE.LOG, 나는 3 단계에 갇혔어요.내 코드 또는 로직, THX에 대한 의견에 감사 할 것인가하는 것은 :)

이것은 내가 지금까지 무엇을 가지고 있습니다 : 모든

var Master = [3, 2, 2, 4, 15, 8]; 
 
var minions = [ 
 
    { 
 
    id : "minion1", 
 
    mimic_result : [2, 1, 0, 3, 11, 5], 
 
    abs_values : [], 
 
    points : [] 
 
    }, 
 
    { 
 
    id : "minion2", 
 
    mimic_result : [1, 3, 2, 1, 12, 7], 
 
    abs_values : [], 
 
    points : [] 
 
    }, 
 
    { 
 
    id : "minion3", 
 
    mimic_result : [6, 0, 0, 0, 0, 1], 
 
    abs_values : [], 
 
    points : [] 
 
    } 
 
]; 
 

 
for(i=0;i<Master.length;i++){ 
 
    for(j=0;j<minions.length;j++) { 
 
    var result = Math.abs(Master[i]-minions[j].mimic_result[i]); 
 
    minions[j].abs_values.push(result); 
 
    } 
 
} 
 

 
for(k=0;k<minions.length;k++) { 
 
    console.log(minions[k].result[0]); 
 
    
 
} 
 

 
console.log(minions[0].abs_values); 
 
console.log(minions[1].abs_values); 
 
console.log(minions[2].abs_values);

답변

1

:

var minionPoints = minions.map(function (minion, i) { 
    return { 
     minionIndex: i, 
     points: 0 
    }; 
}); 
master.forEach(function (masterValue, masterIndex) { 
    var distances = [], 
     buckets = [], 
     points = 0; 
    // calculate distances from master on one individual property 
    minions.forEach(function (minion, minionIndex) { 
     distances.push({ 
      minionIndex: minionIndex, 
      distance: Math.abs(masterValue - minion.imitation[masterIndex]) 
     }); 
    }); 
    // divide into buckets containing items with same distance 
    // (ordered from largest distance to smallest) 
    _.sortBy(distances, 'distance').forEach(function (o) { 
     if (buckets[0] && (o.distance === buckets[0][0].distance)) { 
      buckets[0].push(o); 
     } else { 
      buckets.unshift([o]); 
     } 
    }); 
    // calculate point gain for each item in the bucket 
    // (if there are 2 items in the last and second-last place, they should each get 1.5 points) 
    buckets.forEach(function (bucket) { 
     var totalGain = points + bucket.length + ((bucket.length * (bucket.length + 1))/2) 
      individualGain = totalGain/bucket.length; 
     bucket.forEach(function (o) { 
      minionPoints[o.minionIndex].points += individualGain; 
     }); 
     points += totalGain; 
    }); 
}); 
_.sortBy(minionPoints, 'points').reverse().forEach(function (o, i) { 
    console.log((i + 1) + '. ' + minions[o.minionIndex].id + ' (' + o.points + 
      ' points, imitation [' + minions[o.minionIndex].imitation.join(', ') + 
      '])'); 
}); 

그것은 당신이 제안 거리와 포인트를 계산합니다. 또한, 여러 명의 미니언이 같은 거리를 가졌을 때, 총 포인트 이득은 그들 사이에서 균등하게 나뉩니다.

Working demo.는 (I 게으름에서. 난 그냥 쉽게 네이티브 Array.prototype.sort을 사용하여 수행 할 수있는, 궁극적으로 만 정렬을 사용, 자동으로 소호 - 대쉬를 포함.) 당신은 같은 배열을 처리 할 수 ​​

0

첫째, 제기 예외 TS :

for(k=0;k<minions.length;k++) { 
    console.log(minions[k].result[0]); 
} 

은 다음과 같아야합니다

for(k=0;k<minions.length;k++) { 
    console.log(minions[k].mimic_result[0]); 
} 

아니면 내가 당신을 이해하는 것과 은 당신이해야하는 abs_values 값을 확인하려면 : Lo-Dash를 사용

for(k=0;k<minions.length;k++) { 
    console.log(" the minions["+k+"] abs_values are:\n"); 
    for(l=0;l<minions.abs_values.length;l++) { 
    console.log(minions[k].abs_values[l]); 
    } 
} 
2

는 n 차원 공간에서 점과 이들 사이의 계산 Euclidean distance :

function dist(a, b) { 
    return Math.sqrt(a.reduce(function(sum, _, i) { return sum + Math.pow(a[i] - b[i], 2) }, 0)); 
} 

하고

minions.sort(function(a, b) { 
    return dist(master, a.imitation) - dist(master, b.imitation); 
}); 
을 0
+0

_something_을 계산하는 좋은 방법이지만 OP가 제안한 측정 항목과는 완전히 관련이 없습니다 (각 차원에서 따로 "부하"를 순위 지정하고 거리에 상관없이 ** 순위 **에 따라 점수를 지정). 한 명을 제외하고는 모든 좌표에서 올바른 모방을 가진 미니언을 생각해보십시오. 그러나 "원본으로부터의 거리"를 측정하는 것은 분명 더 깨끗한 접근법입니다. – hon2a

+0

@ hon2a : 내 이해에서 OP는 어떤 점에 가장 가까운 배열을 찾고 싶습니다. 이것이 바로 "거리"입니다. 지금까지의 논리는 저에게이 일을 계산하려는 실패한 시도처럼 보입니다. 나는 그것을 따르지 않는 자유를 택했습니다. – georg

+0

어쨌든, OP는 모든 것이 전부인 것을 명확히해야합니다. – georg

관련 문제