2016-08-09 7 views
0

2つの配列に分割して適切に処理する必要があるオブジェクトが1つあります。 それはこのように見えた:それは私はそれを変換しなければならなかった特定の指示に合わせて、必要があるのでオブジェクトのJS配列のキー値のペアを減らす

{ 
    city:"stuttgart", 
    street:"randomstreet", 
    ... 
} 

:このため

[ 
    {key:"city", value:"stuttgart"} 
    {key:"street", value:"randomstreet"}, 
    ... 
] 

を、私は最初の二つを作成するために

var mapFromObjectWithIndex = function (array) { 
    return $.map(array, function(value, index) { 
    return [value]; 
    }); 
}; 

var mapFromObjectWithValue = function (array) { 
    return $.map(array, function(value, index) { 
    return [index]; 
    }); 
}); 

を使用配列には、古いキーを含むものと、古いものを保持するものとがあります。その後、私は別のものを作成し、2次元配列は、私が使用してこの

var mapToArray = function (arrayValue, arrayIndex) { 
    var tableData = []; 
    for (var i = 0; i<arrayIndex.length; i++){ 
    tableData[i] = {key:arrayIndex[i] , value:arrayValue[i]}; 
    } 
    return tableData; 
}; 

(多分私はすでにここで台無しにしている、これは、任意の容易に行うことができますか?)今

を、やって単一のアレイにそれらをマッピング配列(tableData)を使用してデータをフォームに表示します。値フィールドは編集できます。最後に、配列(tableData)を元のものに変換したいと思います。 (最初のオブジェクトを参照)

元のオブジェクトは文字列を値として含むだけでなく、オブジェクトも含むことに注意してください。

+0

ただ、サイドノート:オブジェクト内のkyesは、最初の注文を維持することが保証されていませんが。したがって、オブジェクトを配列に変換した後、データはランダムな順序になる可能性があります。 – strah

答えて

3

私は、変換は間違いなく容易になることができると思います。

var obj = { 
 
    city:"stuttgart", 
 
    street:"randomstreet", 
 
}; 
 

 
var tableData = Object.keys(obj).map(k => {return {key: k, value: obj[k]}}); 
 

 
console.log(tableData); 
 

 
var dataBack = {}; 
 
tableData.forEach(o => dataBack[o.key] = o.value); 
 

 
console.log(dataBack);

あなたがオブジェクトとはどのように過ごしたいですか?それらも展開したいですか?はい、あなたがこのような何かを行うことができます(そしてそれは同様にネストされたオブジェクトで動作する)場合:objVar.mapToArray()を呼び出すとき

var obj = { 
 
    city:"stuttgart", 
 
    street:"randomstreet", 
 
    obj: {a: 'a', b: 'b'}, 
 
    subObject: {aha: {z: 'z', y: 'y'}} 
 
}; 
 

 
function trasformToTableData(obj) { 
 
    if (typeof obj !== 'object') return obj; 
 
    return Object.keys(obj).map(k => {return {key: k, value: trasformToTableData(obj[k])}}); 
 
} 
 

 
var tableData = trasformToTableData(obj); 
 
console.log(tableData); 
 

 
function transformBack(obj) { 
 
    if (Array.isArray(obj)) { 
 
    var support ={}; 
 
    for (let i = 0; i < obj.length; i++) { 
 
     support[obj[i].key] = transformBack(obj[i].value) 
 
    } 
 
    return support; 
 
    } 
 
    return obj; 
 
} 
 

 
var dataBack = {}; 
 
tableData.forEach(o => dataBack[o.key] = transformBack(o.value)); 
 

 
console.log(dataBack);

+0

あなたの答えは私に最もよく合い、最も完全で柔軟なものだと思います。プロセス全体を非常に簡素化してくれてありがとう。また、初めて私は矢印の表記を参照してください(少なくともWebstormは好きではなかったので、書き直しました) – undefinedMayNotBeNull

+0

@MichaelGerullisは助けてくれてうれしいです!矢印機能は、この例ではなく、ES6の非常に強力なツールですが、自動的に 'this'キーワードのバインディングを設定します。もちろん、通常のインライン関数で変更することができます – rpadovani

2

この関数は、Object.keys()を使用して、配列にあなたのオブジェクトをマッピングし、 .map()

Object.prototype.mapToArray = function() { 
    return Object.keys(this).map(function(v) { 
    return { key: v, value: this[v] }; 
    }.bind(this)); 
} 
+0

第1引数:map()は第2引数を持ちます。バインドする必要はありません。第2引数:太い矢印を使用する場合は2番目の引数も必要ありません。皆さんは、あなたが書いた小さなユーティリティのすべてについて、いくつかのネイティブプロトタイプを拡張しないでください。特にObjectのプロトタイプを拡張しないでください。なぜですか? '" wtf ".mapToArray()またはwindow.addEventListener.mapToArray()' *すべて*がそれを継承するためです。あなたの答えがどのように働くか説明できますか?それは簡単です: 'var mapToArray = obj => Object.keys(obj).map(k =>(key:k、value:obj [k]}))' – Thomas

2

私たちのオブジェクトを繰り返し実行して、次のようにしてみましょう。

​​

+0

また、出力は正しい形式ではないようです。 – Cristy

+1

@Cristyありがとう、私は必要に応じて出力を修正しました。このスニペットでは、オブジェクトをiterableにするためにSymbol.iteratorメソッドを割り当てています。これは 'for'ループやspreadオペレータのようなイテレータがこのオブジェクトを反復できるようにします(iteratorメソッドを呼び出すことによってiteratorオブジェクトが返され、次のメソッドを呼び出すことができます - AKAジェネレータのイテレータ)。 Symbol.iterator関数(ジェネレータ関数)で得られるので、それはそうです。 :) – Redu

1

私はこのようなものだろう:

var dataObj = { 
 
    city:"stuttgart", 
 
    street:"randomstreet", 
 
}; 
 

 
function toKeyValue(obj) { 
 
    var arr = []; 
 
    for (var key in obj) { 
 
    if(obj.hasOwnProperty(key)) { 
 
     arr.push({'key': key, 'value': obj[key]}); 
 
    } 
 
    } 
 
    return arr; 
 
} 
 

 
var arrayKeyValue = toKeyValue(dataObj); 
 
console.log(arrayKeyValue);

関連する問題