bugfix> javascript > 投稿

他のオブジェクトから新しいオブジェクトを作成するにはどうすればよいですか?だから私はこのコードを持っています:

var test = {
    p1: [
        'factorial',
        '11'
    ],
    p3: 'temp1',
    x1: 'factorial'
};

私はこれを取得したい:

Newobj = {
    factorial: [
        'p1',
        'x1'
    ],
    11: 'p1',
    temp1: 'p3'
}

さらに説明すると、最初のオブジェクトの値は2番目のオブジェクトのキーになりますが、配列があるように、すべての値を調べる必要があります。加えて、私は繰り返したくありません。たとえば、factorialは2つのキーp1とx1に存在するため、factorialは1回だけ書き込む必要がありますが、配列にはそれを取得した場所が含まれます。

ありがとうございました!!

回答 1 件
  • 私はこれらのmap/reduceの問題をただひどく思っています。

    最初に作成します地図  test の    test の配列へ  キー その値に一致します。

    その後、それを減らします地図 プレーンオブジェクトへ。長さが1より大きい場合は配列値を取得し、そうでない場合は最初のエントリのみを取得します。

    const test = {"p1":["factorial","11"],"p3":"temp1","x1":"factorial"}
    // create an intermediary Map of keys and values
    const newMap = Object.keys(test).reduce((map, key) => {
      // force the value to an array for consistency and iterate
      [].concat(test[key]).forEach(val => {
        // create or add to the "key" to the array at map.get(val)
        map.set(val, (map.get(val) || []).concat(key))
      })
      return map
    }, new Map())
    // now reduce the Map entries to a plain object
    const newObj = Array.from(newMap).reduce((obj, [key, val]) => ({
      ...obj,
      [key]: val.length > 1 ? val : val[0] // only use an array if more than one entry
    }), Object.create(null)) // Object.create(null) creates a plain object
    console.info(newObj)
    
    

    ただし、いくつかのアドバイス...エントリが1つしかない場合でも、すべての値の配列を作成します。これにより、オブジェクトを繰り返し使用するための一貫したAPIが作成されます。

あなたの答え