web-dev-qa-db-ja.com

オブジェクトの配列をCoffeeScriptのキー/値ペアにマッピングする

マッピングを適用して、単一のオブジェクトのキーと値のペアに変換する(連想配列を模倣する)要素の配列があります。

CoffeeScriptで投影を行うために構造化割り当てを使用できますか? のアプローチは、キー/値のペアではなく単純な配列になるため、私には機能しないようです。

私が選んだ言語はCoffeeScriptまたはJavaScriptです。

例:

[{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]

に変換されることになっています:

{
  a: 'b',
  d: 'e'
}

ワンライナーが推奨されます。 ;-)

構文エラーを修正するには、_{ @name: @value }_を次のように展開する必要があります。

_o = {}; o[@name] = @value; o
_

その後、$.extend()と感嘆符(jQueryを誤って拡張しないように空のオブジェクトを使用)を使用してオブジェクトをマージできます。

_$.extend {}, $(row).children('input').map(() -> o = {}; o[@name] = @value; o)...
_

ただし、より単純なオプションは、2ライナーを使用することです。

_result = {}
$(row).children('input').each(() -> result[@name] = @value)
_
12
var arr = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}];

var obj = arr.reduce(function ( total, current ) {
    total[ current.name ] = current.value;
    return total;
}, {});

純粋なjavascript。それは実際には1つのライナーであり、hawtに見えます。

Array.prototype.reduce はES5ですが、シムするのは難しくありません。シムの例を次に示します。

Array.prototype.reduce = function ( fun, initVal ) {
    var sum = initVal || this[ 0 ],
        i = 1, len = this.length;

    do {
        sum = fun.call( undefined, sum, this[i], i, this );
    } while ( ++i < len );

    return sum;
};

arr.reducearr.mapの洗練されたバージョンであり、arr.forEachの洗練されたバージョンです。同じ効果のためにこれを行うことができます:

var obj = {};
arr.forEach(function ( val ) {
    obj[ val.name ] = val.value;
});

//and using jQuery.each
var obj = {};
$.each( arr, function ( index, val ) {
    obj[ val.name ] = val.value;
});

//latter version in coffeescript:
obj = {}
$.each( arr, (index, val) ->
    obj[ val.name ] = val.value
)
78
Zirak
values = {}
values[name] = value for {name, value} in arr

またはjavascriptで:

var values = {}
arr.forEach(function(o){
    values[o.name] = o.value
})

これは、CoffeeScriptのコンパイル先とほぼ同じです。

19
Ricardo Tomasi

または、プレーンなES6を使用します。

const old = [
  {name: 'a', value: 'b', other: 'c'}, 
  {name: 'd', value: 'e', other: 'f'}
]

const transformed = Object.assign(
  {}, 
  ...old.map(({name, value}) => ({ [name]: value }))
);

console.log(transformed);
9
Tieme

Array.prototype.reduce() を使用:

var arrayOfObjects = [
              {name: 'a', value: 'b', other: 'c'}, 
              {name: 'd', value: 'e', other: 'f'}
            ];

arrayOfObjects.reduce(function(previousValue, currentValue, currentIndex) {
  previousValue[currentValue.name] = currentValue.value;
  return previousValue;
}, {})
5
Onato

http://coffeescriptcookbook.com/chapters/arrays/creating-a-dictionary-object-from-an-array をご覧ください

  myArray = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]
  dict = {}
  dict[obj['name']] = obj['value'] for obj in myArray when obj['name']?
  console.log(JSON.stringify(dict, 0, 2));

これはまさにあなたが望むものを生成します。

1
rwitzel

ES6ワンライナー:

const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]

data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})
1
ducaale