2017-11-01 18 views
3

を持つ各指定されたキーのための新しいオブジェクトを作成しますが、そうのように、CSVファイルから引っ張っ:配列:私はオブジェクトの配列を持っている価値

const data = [ 
    { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, 
    { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, 
    { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, 
    { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' } 
] 

私はいくつかのグラフや表を作成していますデータ、および2つの新しいキー、「場所」と「価値」を作成し、各オブジェクト内の各位置の値のための新しいオブジェクトを作成する必要があり、このように:

const newData = [ 
    { location: 'Houston', value: '375', name: 'p1', 'date started': 'April 2007' }, 
    { location: 'Dallas', value: '508', name: 'p1', 'date started': 'April 2007' }, 
    { location: 'El Paso', value: '1232', name: 'p1', 'date started': 'April 2007' }, 
    { location: 'El Paso', value: '43', name: 'p2', 'date started': 'April 2017' }, 
    { location: 'Houston', value: '18789', name: 'p3', 'date started': 'June 2012' }, 
    { location: 'Austin', value: '8977', name: 'p3', 'date started': 'June 2012' }, 
    { location: 'El Paso', value: '6754656', name: 'p3', 'date started': 'June 2012' }, 
    { location: 'Houston', value: '878', name: 'p4', 'date started': 'December 2015' }, 
    { location: 'Dallas', value: '4556', name: 'p4', 'date started': 'December 2015' }, 
    { location: 'Austin', value: '987', name: 'p4', 'date started': 'December 2015' }, 
    { location: 'El Paso', value: '1456232', name: 'p4', 'date started': 'December 2015' } 
] 

私は前に似たようなプロジェクトのためにこれをしなければなりませんでした短い時間で終了し、元のCSVファイルを手動で編集することになりました。私はむしろそれをやり直したいと思う。これまでmap/forEachとObject.keysのさまざまな組み合わせを試しましたが、運がありません。

どのようなアイデアも大歓迎です!

答えて

2

オブジェクトのすべてのキーを反復し、不要なプロポーザリを除外し、結果セットの新しいオブジェクトを作成できます。

var data = [{ name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' }], 
 
    result = data.reduce(function (r, o) { 
 
     Object.keys(o).forEach(function (k) { 
 
      if (['name', 'date started'].includes(k) || !o[k]) { 
 
       return; 
 
      } 
 
      r.push({ location: k, value: o[k], name: o.name, 'date started': o['date started'] }); 
 
     }); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

レバーは、うまく動作し、私に時間を節約します!感謝万円! –

+1

@ JoshuaSwiss:実際には、フロー制御の代わりに論理演算子を使用しないでください。あなたはコードを読む必要がある人々から深刻なプッシュバックを受けるでしょう。より賢明な解決策は次のようになります:https://jsfiddle.net/5fvLc8mm/適切なフロー制御を使用して、除外されたキー配列の繰り返し割り当てを避け、 'o [k]'真実です。これらのことは、コードが分かりやすくレイアウトされているとはるかに簡単です。 – llama

+0

素敵な仕事!それははるかにクリーンです。ありがとう! –

1

あなたはとても

const data = [ 
 
     { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, 
 
     { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, 
 
     { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, 
 
     { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' } 
 
    ]; 
 

 
function transform() { 
 
    
 
    var newObjects = []; 
 
    data.forEach(item => { 
 
     Object.keys(item).forEach(keyName => { 
 
      if (keyName !== "name" && keyName !== "date started") { 
 
       newObjects.push({ 
 
        location: keyName, 
 
        value: item[keyName], 
 
        ["date started"]: item["date started"], 
 
        name: item["name"] 
 
       }) 
 
      } 
 
     }); 
 
    }); 
 
    return newObjects; 
 
} 
 

 
console.log(transform(data));
のように、古いオブジェクトであるし、古いオブジェクト内のすべてのキーを反復処理し、それに基づいて新しいアレイを構築するすべての itemsを反復処理でき

希望は

1

これは、構造の割り当てと休憩/スプレッドの構文がきれいになります。

const data = [ 
 
    { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, 
 
    { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, 
 
    { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, 
 
    { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' } 
 
]; 
 

 
const result = data.reduce((res, obj) => { 
 
    const date_started = obj["date started"]; 
 
    delete obj["date started"]; 
 
    const {name, ...rest} = obj; 
 
    
 
    return [...res, ...Object.entries(rest).map(([k,v]) => 
 
    ({location:k, value:v, name:name, 'date started':date_started}) 
 
)] 
 
}, []); 
 

 
console.log(result);


オブジェクトリテラルで、残りのパラメータを避けたい、とあなたは空の場所をしたくない場合は、非を除外するために使用されSetを作成することができます真の評価を使用して、望ましくない場所を除外します。完全に一般的なアプローチで

var data = [{ name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' }]; 
 

 
var exc = new Set(['name', 'date started']); 
 
var result = data.reduce((r, o) => 
 
    [ 
 
     ...r, 
 
     ...Object.entries(o) 
 
     .filter(([k, v]) => v && !exc.has(k)) 
 
     .map(([k, v]) => ({ location: k, value: v, name: o.name, 'date started': o['date started'] })) 
 
    ] 
 
, []); 
 

 
console.log(result, null, 2);

+0

もしうまくいくなら... –

+0

@ニーナシュコルス:何がうまくいかない? – llama

+0

オブジェクトで休息。 –

1

各新しく作成されたデータ項目に対して「そのまま」OPが割り当てられているすべてのキーと値のペアを制御している...とさえ各データ入力タプルの代理キーのための...スーパーcは

var data = [ 
 
    { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, 
 
    { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' }, 
 
    { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' }, 
 
    { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' } 
 
]; 
 

 
var newData = data.reduce(function (collector, dataItem) { 
 
    var 
 
    //itemEntryList = Object.entries(dataItem); // if available, otherwise next line ... 
 
    itemEntryList = Object.keys(dataItem).map(function (key) { 
 
     return [key, dataItem[key]]; 
 
    }), 
 
    assignerList = [], 
 
    assignerKey, 
 
    idx = -1, 
 
    keyForDataKey = collector.keyForDataKey, 
 
    keyForDataValue = collector.keyForDataValue, 
 
    protectedKeyList = collector.protectedKeyList; 
 

 
    // implement a local `reject` ... for all key value pairs that have to be copied "as is". 
 
    while ((assignerKey = itemEntryList[++idx]) && (assignerKey = assignerKey[0])) { 
 
    if (protectedKeyList.some(function (protectedKey) { 
 
     return (assignerKey === protectedKey); 
 
    })) { 
 
     assignerList.push({ key: assignerKey, value: itemEntryList[idx][1] }); 
 
     itemEntryList.splice(idx, 1); 
 
     --idx; 
 
    } 
 
    } 
 
    // create new data-item base-structures from the remaining `dataItem` tuples after the `reject` step. 
 
    var dataItemList = itemEntryList.reduce(function (itemList, dataTuple) { 
 

 
    var tupleValue = dataTuple[1]; 
 
    if (tupleValue) { 
 
     var newDataItem = {}; 
 
     newDataItem[keyForDataKey] = dataTuple[0]; 
 
     newDataItem[keyForDataValue] = tupleValue; 
 

 
     itemList.push(newDataItem); 
 
    //itemList.push({ location: dataTuple[0], value: tupleValue }); 
 
    } 
 
    return itemList; 
 

 
    }, []); 
 

 
    // for each new data item ... 
 
    dataItemList.map(function (newDataItem) { 
 
    return assignerList.reduce(function (dataItem, assignerItem) { 
 

 
     // ... reassign all formerly rejected key value pairs that have to be copied "as is". 
 
     dataItem[assignerItem.key] = assignerItem.value; 
 
     return dataItem; 
 

 
    }, newDataItem) 
 
    }); 
 

 
    // collect all new data items. 
 
    collector.dataItemList = collector.dataItemList.concat(dataItemList); 
 

 
    return collector; 
 

 
}, { 
 

 
    keyForDataKey: 'location', 
 
    keyForDataValue: 'value', 
 

 
    protectedKeyList: ['name', 'date started'], 
 
    dataItemList:  [] 
 

 
}).dataItemList; 
 

 

 
console.log('data : ', data); 
 
console.log('newData : ', newData);
.as-console-wrapper { max-height: 100%!important; top: 0; }

関連する問題