2016-08-01 12 views
0

私は配列を使って作業していましたが、オブジェクトを含む配列をループして異なる値のキーを取り出し、それらを多次元配列に変換する式を作成します。キーの順序を保持する必要があります)。私はすでに、この配列を取得していますが、今、私は追加する必要がある[「N/A」「 - 」]の文字列が同じではありませんすべての位置に、次のように:配列体系

var all = [ 
    {banana: 1, rose: 2, mouse: 9, apple: 5, ana: 4, carl: 'truck'}, 
    {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3, carl: 'blue'}, 
    {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5, ana: 8} 
]; 

//expected to get: 
var new-arr = [ [["ana", 4], ["n/a", "--"], ["carl", "truck"]], 
    ["n/a", "--"], ["cheese", 3], ["carl", "blue"]], 
    [["ana", 8], ["cheese", 2], ["n/a", "--"]] ]; 

でいるので、

  • カール:トラック
  • - :

    • ANA:4
    • N /終了私はこの

      リスト1のようなリストを作成するCNAの

      LIST2:

      • N/-
      • チーズ:3
      • カール:青

      LIST2:

      • ANA:8
      • チーズ:2
      • N /: -

      コードはここに https://jsbin.com/yedusigara/1/edit?js,console

      である私が何か間違ったことをしましたか? 1つの機能ですべてを行うことができる方法はありますか?

    +0

    @Tibrogarganご連絡ありがとうございます。しかし、私の式はまだ動作しませんでした – Zorgg

    +1

    "*私はキーの順序を保つ必要があります*"実際にはキーは順序がありません。 – Bergi

    +0

    私は本当にあなたが "n/a"でやろうとしていることを得ていません。例を短くして、少し明確にすることはできますか?不一致のものを追跡するのに苦労している – Assimilater

    答えて

    1

    あなたのバグが質問に示すが、それは、この部分では、フィドルであるされていません。

    $('.lol').each(function (i, elm) { 
    similar_keys[i].forEach(function(spec, j){ 
        similar_keys[j].forEach(function (spec1, j1){ 
        if(spec[0] != spec1[0] && j != j1){ 
         similar_keys[i].push(['n/a', '--']); 
        } 
    }); 
    

    それは第三ループ上similar_keys [J]を反復処理するために、任意の意味がありません。 jは内部配列のインデックスです。このコードは意味をなさない。 DOM内の同じ数の要素とデータ内のオブジェクトを使用することにも依存しています。

    私はあなたが達成しようとしているところで推測することができますが、元のアルゴリズムを代わりに変更します。たぶん、この:

    function similars(arr) { 
    var similar_keys = []; 
    for (var i = 0; i < arr.length; i++) { 
        var tempArr = []; 
        for (var key in arr[i]) { 
        var found = false; 
        var count = 0; 
        var index = 0; 
        for (var j = 0; j < arr.length; j++) { 
         if (arr[j].hasOwnProperty(key)) { 
         ++count; 
        } 
        if (i !== j && arr[j][key] === arr[i][key]) { 
        found = true; 
        break; 
        } 
        } 
        if (!found && count > 1) { 
         tempArr.push([key, arr[i][key]]); 
        } 
        else if (count > 1) { 
         tempArr.push(["N/A", arr[i][key]]); 
        } 
        } 
        similar_keys.push(tempArr); 
    } 
    return similar_keys; 
    

    }

    EDIT:あなたが探しているもの まだわかりません。

    1)similar_keysの各行を最初の要素で並べ替えます。 2)各行の最初の要素を比較し、並べ替え順序が最も低い行にN/Aエントリを挿入します。 3)各列に進み、必要に応じて挿入します。

    私は

    EDITを証明するためにあなたのフィドルを修正しようとします: これは動作するはずですが。 https://jsbin.com/nesiqogebo/edit?js,console,output

    +0

    ありがとう、私は問題の説明に最後の部分を追加します。あなたの摂取はうまく動作していません。 これは私が得るものです: '[[" N/A "、5]、[" ana "、4]、[" carl "、" truck "]] – Zorgg

    +0

    ええ、私は理解していないと思います。あなたの意図はとても良い。完成したアレイをパッドしたいと思う。 –

    +0

    説明を見てください私はそれが私の目標が何であるかを言って更新します。 – Zorgg