2017-04-21 9 views
1

このようなJSONを正規化することが可能である場合、私は疑問に思って:"normalizr"で "excel-like" JSON(IDなし)を正規化することはできますか?

{ 
"rows": [{ 
     "cells": [{ 
       "value": "Column Name 1" 
      }, 
      { 
       "value": "Column Name 2" 
      }, 
      { 
       "value": "Column Name 3" 
      }, 
      { 
       "value": "Column Name 4" 
      } 
     ] 
    }, 
    { 
     "cells": [{ 
       "value": "Second Row Thing1" 
      }, 
      { 
       "value": "Second Row Thing2" 
      }, 
      { 
       "value": "Second Row Thing3" 
      }, 
      { 
       "value": "Second Row Thing4" 
      } 
     ] 
    }, 
    { 
     "cells": [{ 
       "value": "Third Row Thing1" 
      }, 
      { 
       "value": "Third Row Thing2" 
      }, 
      { 
       "value": "Third Row Thing3" 
      }, 
      { 
       "value": "Third Row Thing4" 
      } 
     ] 
    } 
] 

}

を、このような素敵な形式に:

{ 
    "rows": [{ 
      "Column Name 1": "Second Row Thing1" 
      "Column Name 2": "Second Row Thing1" 
      "Column Name 3": "Second Row Thing1" 
      "Column Name 4": "Second Row Thing1" 
     }, 
     { 
      "Column Name 1": "Third Row Thing1" 
      "Column Name 2": "Third Row Thing1" 
      "Column Name 3": "Third Row Thing1" 
      "Column Name 4": "Third Row Thing1" 
     } 

    ] 
} 

基本的に私はそれを扱う最初の行のデータ・アリを利用したいと思います列名のようなものです。そして、私の行オブジェクトのキーの名前としてこれらの列名を使用します。 "normalizr"でこのようなことをすることは可能ですか?または、私は "マップ"、 "foreach"などの配列のものに深く浸るべきですか? :)

+0

性質が全く定義された順序を持っていないオブジェクトのことに注意してください。 – Pointy

答えて

0

Normalizrは実際には必要ありません(使用しないでください)。これは動作しないためです。 Normalizrはネストされたデータのためのものです:他のエンティティ(ツイートに埋め込まれたユーザのような)への参照を持つエンティティ。

マップ/ Reduceは、このようなもので本当にうまく動作します。ここにあなたが求めていることを正確に行うスニペットがあります。

const data = { "rows": [ 
 
    { "cells": [{ "value": "Column Name 1" }, { "value": "Column Name 2" }, { "value": "Column Name 3" }, { "value": "Column Name 4" } ]}, 
 
    { "cells": [{ "value": "Second Row Thing1" }, { "value": "Second Row Thing2" }, { "value": "Second Row Thing3" }, { "value": "Second Row Thing4" } ] }, 
 
    { "cells": [{ "value": "Third Row Thing1" }, { "value": "Third Row Thing2" }, { "value": "Third Row Thing3" }, { "value": "Third Row Thing4" } ] } 
 
]}; 
 

 
// Get an array of the values of the first row 
 
const columns = data.rows[0].cells.map(({ value }) => value); 
 

 
// slice = take all rows except the first 
 
// mapp each array of cells 
 
const normalizedData = data.rows.slice(1).map(({ cells }) => { 
 
    // reduce = converts the array of cells into an object map 
 
    return cells.reduce((memo, { value }, i) => { 
 
    memo[columns[i]] = value; 
 
    return memo; 
 
    }, {}); 
 
}); 
 

 
console.log(JSON.stringify(normalizedData, null, 2));

関連する問題