0

<a>要素の 1 つと要素の別の 2 つのノード リストがあり<img>ます。これらのノード リストのサイズは異なります。

これらのノードのそれぞれに、score という属性を追加しました。現在、これを行うメソッドがあります:

getImageWithBiggestScore: function(images,anchor_images) {

                var best_scored_image = images[0];

                for (var i = 1; i < images.length; i++) {
                    if (images[i].score > best_scored_image.score) {
                        best_scored_image = images[i];
                    }
                }

                for (var i = 0; i < anchor_images.length; i++) {
                    if (anchor_images[i].score > best_scored_image.score) {
                        best_scored_image = anchor_images[i];
                    }
                }

                return best_scored_image;
            },

そして、これは最大のスコアを持つノードを返します。ただし、最大のスコアを持つ 3 つのノード (または 5,6... 理想的には関数のパラメーター) を取得したいと思います。どうやってやるの?

4

2 に答える 2

1

これが正しければ、次のことができます...

HTML

<ul id='x'>
    <li data-score='1'></li>
    <li data-score='44'></li>
    <li data-score='2'></li>
    <li data-score='10'></li>
</ul>

<ul id='y'>
    <li data-score='9'></li>
    <li data-score='1'></li>
    <li data-score='1'></li>
    <li data-score='3'></li>
</ul>

Javascript

var x = Array.prototype.slice.call(document.getElementById('x').children),   // images
    y = Array.prototype.slice.call(document.getElementById('y').children),   // anchor_images
    z = [],             // array that will keep the results
    param = 4,          // number of nodes as a parameter
    sortFunc = function(a, b) { 
        if(typeof a === 'object' && typeof b === 'object') 
            return (b.getAttribute('data-score') * 1) - (a.getAttribute('data-score') * 1);
    }; // sort desc

x.sort(sortFunc);       // order the first array desc
y.sort(sortFunc);       // order the second array desc

// push into z the highest values of each array 
for(var i = 0; i < param; i++) {
    z.push(x[i]);
    z.push(y[i]);
}

// now, z contains the combination of the highest values from x and y
z.sort(sortFunc);   // sort desc the new array 
z = z.splice(0, param); // get the result :)

var result = "";

for(var i = 0; i < z.length; i++) {
    result += z[i].getAttribute('data-score') + ",";
}

document.getElementById('result').innerHTML = result;

コードに固有のものでこれを機能させるには、適応する必要があるかもしれません...実際のコード: http://jsfiddle.net/YHjgY/5/

于 2013-10-25T16:52:52.503 に答える
0

おそらくここで再帰を使用します

再帰関数は次のようになります

var arrObjs = new Array();
arrObjs.push("a elements arr obj"); // pushes the complete array of a elements to the first index of arrObjs
arrObjs.push("div elements arr obj"); // 
var value = run(0,0);
function run (index,biggestScore){
    var arr = new Arrray();
    var smallestLength = 999; // could probably write this a better way. Assuming the length would not be more than 999 length
    for(var i=0; i < arrObjs.length;i++){
       if(arrObjs[i].length >= index){
          if((arrObjs[i].length-index) < smallestLength){
              smallestLength = arrObjs[i].length
          }
       arr.push(arrObjs[i]);
       }
    }

    for(var j=0; j < arr.length;j++){
       for(var k=index; k<arr[j].length;k++){
          if(arr[j][k].score>biggestScore){
              biggestScore.score = arr[j][k];
          }
       }
    }

    biggestScore = run(smallestLength,biggestScore);
    return biggestScore;
}

多少の誤差がある場合がございます。テストしませんでした。その背後にある基本的な考え方を理解したと思います。ご不明な点がございましたら、お気軽にお問い合わせください:)

于 2013-10-25T17:20:34.047 に答える