2016-07-27 5 views
-1

Javascript配列を変更して、同じ値を持つ要素を指定して他のプロパティをコンマ区切りの文字列として保持する方法でオブジェクトをマージします、JSON文字列、または配列です。基本的に、私はこのオンにする:このにJavascript - 複数のキーオブジェクトを持つ配列を減らす

[ 
    { 
     "language" : "english", 
     "type" : "a", 
     "value" : "value1" 
    }, 
    { 
     "language" : "english", 
     "type" : "a", 
     "value" : "value2" 
    }, 
    { 
     "language" : "english", 
     "type" : "b", 
     "value" : "value3" 
    }, 
    { 
     "language" : "spanish", 
     "type" : "a", 
     "value" : "valor1" 
    } 
] 

を:

[ 
    { 
     "language" : "english", 
     "type" : "a", 
     "value" : ["value1" , "value2"] // A Json string is welcome too 
    }, 
    { 
     "language" : "english", 
     "type" : "b", 
     "value" : "value3" 
    }, 
    { 
     "language" : "spanish", 
     "type" : "a", 
     "value" : "valor1" 
    } 
] 

Iは、スニペットに与えられたオブジェクトをアップサート、その後、反復処理やフィルタリングを試してみました。しかし、私はよりエレガントな方法があるかどうか疑問に思うそれを行うには。

P.S. EcmaScript6と追加のJSライブラリの提案も歓迎します。

var originalArray = [ 
 
\t { 
 
\t \t "language" : "english", 
 
\t \t "type" : "a", 
 
\t \t "value" : "value1" 
 
\t }, 
 
\t { 
 
\t \t "language" : "english", 
 
\t \t "type" : "a", 
 
\t \t "value" : "value2" 
 
\t }, 
 
\t { 
 
\t \t "language" : "english", 
 
\t \t "type" : "b", 
 
\t \t "value" : "value3" 
 
\t }, \t 
 
\t { 
 
\t \t "language" : "spanish", 
 
\t \t "type" : "a", 
 
\t \t "value" : "valor1" 
 
\t } 
 
]; 
 

 
var resultingArray = []; 
 

 
// iterate through the original array 
 
$.each(originalArray, function(i, val) { 
 
    // apply filter on key properties (i.e. language and type) 
 
    var result = resultingArray.filter(function(obj) { 
 
    return (obj.language === val.language && obj.type === val.type); 
 
    }); 
 
    // if a record exists, update its value 
 
    if (result.length === 1) { 
 
    result[0].value += (", " + val.value); 
 
    } 
 
    // else, add value 
 
    else if (result.length === 0) { 
 
    resultingArray.push(val); 
 
    } 
 
    // if multiple rows exist with same key property values... 
 
    else { 
 
    alert("Too many records with language '" + val.language + "' and type '" + val.type + "'"); 
 
    } 
 
}); 
 

 
console.log(JSON.stringify(resultingArray));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

+1

(http://pastebin.com/bx66Vc5K)あなたは "エレガント" と考えるものに応じて、[ここに私の提案ソリューションでした]。 'filter'関数は' each'の最初の反復で1回、2回目の反復では2回、というように 'O(N^2)'で実行されます。その必要はありません。 –

+1

[ここ](https://jsfiddle.net/Arnauld/0eyxbf70/)は私のもので、 'value'は常に配列です。ところで、あなたの 'alert()'ステートメントは決して引き起こされないと思います。同じキー(言語+タイプ)で同じ_value_を2回使用したくない場合は、別の方法で行う必要があります。 – Arnauld

+0

あなたのJSはjQueryを使用していましたが、どうしてjQueryタグを追加しないのですか?私は学び、純粋なjavascript 'forEach'を使って-_-を助けることを確かめました! –

答えて

0

これは何が必要でしょうか?

var baseData= [ 
 
    { 
 
     "language" : "english", 
 
     "type" : "a", 
 
     "value" : "value1" 
 
    }, 
 
    { 
 
     "language" : "english", 
 
     "type" : "a", 
 
     "value" : "value2" 
 
    }, 
 
    { 
 
     "language" : "english", 
 
     "type" : "b", 
 
     "value" : "value3" 
 
    }, 
 
    { 
 
     "language" : "spanish", 
 
     "type" : "a", 
 
     "value" : "valor1" 
 
    } 
 
]; 
 

 
var newData = []; 
 
baseData.forEach(function(item, index) { 
 
    if (newData.length === 0) { 
 
    newData.push(item); 
 
    
 
    } else { 
 
    var dIndex = -1; 
 
    newData.forEach(function(itm, idx) { 
 
     if (item.language === itm.language && item.type === itm.type) dIndex = idx; 
 
    }); 
 
    
 
    if (dIndex !== -1) { 
 
     var oldValue = newData[dIndex].value; 
 
     
 
     if (typeof(oldValue).toString() === 'string') { 
 
     newData[dIndex].value = [oldValue, item.value]; 
 
     } 
 
    } else { 
 
     newData.push(item); 
 
    } 
 
    } 
 
}); 
 
console.log(newData);

関連する問題