سؤال

لنقول إن لدي هذه المجموعة من مديري الأفلام:

var directors = ['Woody Allen', 'Woody Allen', 'Clint Eastwood', 'Quentin Tarantino', 'Robert Rodriguez', 'Woody Allen', 'Steven Soderberg', 'Robert Rodriguez, Quentin Tarantino' ];

يبدو أن php print_r من aray مثل هذا:

Array
(
    [0] => Woody Allen
    [1] => Woody Allen
    [2] => Clint Eastwood
    [3] => Quentin Tarantino
    [4] => Robert Rodriguez
    [5] => Woody Allen
    [6] => Steven Soderberg
    [7] => Robert Rodriguez, Quentin Tarantino
)

ما أود أن أفعله به هو حلقة الصفيف وإنشاء صفيف ترابط جديد مع الاسم كمفتاح وعدد المرات التي يظهر فيها في الصفيف كقيمة. بالإضافة إلى فرز المصفوفة بعد القيمة الأعلى أولاً ، بحيث تكون النتيجة النهائية مثل TIHS:

Array
(
    [Woody Allen] => 3
    [Robert Rodriguez] => 2
    [Quentin Tarantino] => 2
    [Steven Soderberg] => 1
    [Clint Eastwood] => 1
)

أنا لست خبيراً في JavaScript ، لكن إذا كنت سأفعل ذلك في PHP ، فسأفعل هذا:

$directors = array();
foreach($dirs as $d){
    $pos = strpos($d,",");
    if($pos === false) {
        if($directors[$d]){
            $directors[$d] = $directors[$d]+1;
        }else{
            $directors[$d] = 1;
        }
    }else{
        $da = explode(",",$d);
        foreach($da as $d){
            $d = trim($d);
            if($directors[$d]){
                $directors[$d] = $directors[$d]+1;
            }else{
                $directors[$d] = 1;
            }
        }
    }
}
arsort($directors);

جربت الكثير من الطرق لفعل الشيء نفسه في JavaScript ، ولكن نظرًا لأن المصفوفات الترابطية غير موجودة بنفس الطريقة في JS ، فقد واجهت مشاكل في العمل. كانت أفضل محاولتي هي هذا الرمز ، لكنه لا يفعل ما أريد:

function add2array(a,v){
    if(a[v] != null){
        a[v] = a[v]+1;
    }else{
        a[v] = 1;
    }
}

$.each(directors, function(k, v){
    if(v.indexOf(",") != -1){
        dirs = v.split(",");
        $.each(dirs, function(k, v){
            dtrim = $.trim(v);
            console.log(dtrim);
            add2array(r,dtrim);
        });

    }else{
        add2array(r,v);
    }

});

هذا يجعل كائن JS-Object كبيرًا مع Directorname كمفتاح وعدًا كقيمة ، ولكن هل هناك أي طريقة بالنسبة لي لفرز ذلك؟ أو هل أحتاج إلى عمل مجموعة من الأشياء للقيام بذلك. سيكون مفيدًا حقًا إذا كان بإمكان أي شخص مساعدتي في حل هذا. أنا أستخدم jQuery قدر الإمكان حتى يتمكن الحل الخاص بك من استخدام ذلك.

هل كانت مفيدة؟

المحلول 2

لقد حللت ذلك بنفسي:

var r = {}, re = [];

function add2array(a,v){
    if(a[v] != null){
        a[v] = a[v]+1;
    }else{
        a[v] = 1;
    }
}

$.each(directors, function(k, v){
    if(v.indexOf(",") != -1){
        dirs = v.split(",");
        $.each(dirs, function(k, v){
            dtrim = $.trim(v);
            add2array(r,dtrim);
        });

    }else{
        add2array(r,v);
    }

});

for (var i in r) {
    re.push({ name : i, count : r[i] });
}


function compare(a,b) {
  if (a.count > b.count)
     return -1;
  if (a.count < b.count)
    return 1;
  return 0;
}

re.sort(compare);

إنه يعمل بشكل رائع على صفحة مستقلة ، ولكن يجب أن يكون هناك بعض الصراع مع البرامج النصية الأخرى التي تجعلني لا أستطيع استخدامها حيث أحتاج إليها ...

نصائح أخرى

ليس للصفائف الترابطية أي طلب ، لذلك لا يمكنك فرزها. سيكون عليك إنشاء صفيف يحتوي على مفتاح: قيمة أزواج ثم فرز خاصية العنصر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top