2016-12-19 8 views
0

私は2つのJSON配列とキーを示す日付を1つの行にして、鉄とコンクリートを合計しますか?Javascript - キーと同じ日付のJSON配列の合計

var a = ['Nov 1 2016','Nov 2 2016','Nov 3 2016','Nov 4 2016']; 
var b = [{Date:'Nov 1 2016', steel:10.98},{Date:'Nov 3 2016', steel:5.67},{Date:'Nov 4 2016', steel:3.14}] 
var c = [{Date:'Nov 1 2016', concrete:9.10},{Date:'Nov 2 2016', concrete:16.8},{Date:'Nov 4 2016', concrete:7.20}] 

//output sum of steel and concrete 
var x = [{Date:'Nov 1 2016', val:20.08},{Date:'Nov 2 2016', val:16.8},{Date:'Nov 3 2016', val:5.67},{Date:'Nov 4 2016', val:10.34}] 

答えて

1

日付アレイの上と(0値を持つデフォルトのアイテムを提供見つからない場合)bcの対応する項目を見つけ、すべての日のために反復し、総括され何ができ、それぞれのsteelconcreteプロパティ。すなわち

、その日付とその日付のsteelconcreteの和を含むオブジェクトに(map)毎に日付文字列に変換する:

機能は

// converts a date and a value into an object containing that date and that value 
const toDateAndValueObj = (date, val) => ({ date, val }); 

// takes two objects (or the objects with default values if passed undefined) and sums up their respective `steel` and `concrete` properties 
const sumSteelAndConcrete = (s = { steel: 0 }, c = { concrete: 0 }) => s.steel + c.concrete; 

// finds an item in the array who's Date property lexicographically equals the given date string 
const findByDate = (arr, date) => arr.find(item => item.Date === date); 
あろう
// dates is the `a` array, steelDays is the `b` array, concreteDays is the `c` array 
const result = dates.map(date => 
    toDateAndValueObj(
    date, 
    sumSteelAndConcrete(
     findByDate(steelDays, date), 
     findByDate(concreteDays, date) 
    ) 
) 
); 

ここでは、簡略化のために日付の文字列比較を使用しています。

const findByDate = (arr, date) => arr.find(item => new Date(item.Date).getTime() === new Date(date).getTime()); 

全デモ:

const dates = ['Nov 1 2016','Nov 2 2016','Nov 3 2016','Nov 4 2016']; 
 
const steelDays = [{Date:'Nov 1 2016', steel:10.98},{Date:'Nov 3 2016', steel:5.67},{Date:'Nov 4 2016', steel:3.14}]; 
 
const concreteDays = [{Date:'Nov 1 2016', concrete:9.10},{Date:'Nov 2 2016', concrete:16.8},{Date:'Nov 4 2016', concrete:7.20}]; 
 

 
const toDateAndValueObj = (date, val) => ({ date, val }); 
 
const sumSteelAndConcrete = (s = { steel: 0 }, c = { concrete: 0 }) => s.steel + c.concrete; 
 
const findByDate = (arr, date) => arr.find(item => item.Date === date); 
 

 
const result = dates.map(date => 
 
    toDateAndValueObj(
 
    date, 
 
    sumSteelAndConcrete(
 
     findByDate(steelDays, date), 
 
     findByDate(concreteDays, date) 
 
    ) 
 
) 
 
); 
 

 
console.log(result);

+0

なぜ私のコードで実行しようとするとこのエラーが出るのですか? ** const sumSteelAndConcrete =(s = {steel:0}、c = {concrete:0})=> s.steel + c.concrete; \ n SyntaxError:予期しないトークン= ** –

+0

あなたの環境がデフォルトパラメータ(ES6)をサポートしていない可能性が最も高いです。コードをES5にしてES6をまったく使用しないようにするには、[Babel](https://babeljs.io/repl/)に貼り付けて、 – nem035

0

var b = [{Date:'Nov 1 2016', steel:'10.98'},{Date:'Nov 3 2016', steel:'5.67'},{Date:'Nov 4 2016', steel:'3.14'}]; 
 
var c = [{Date:'Nov 1 2016', concrete:'9.10'},{Date:'Nov 2 2016', concrete:'16.8'},{Date:'Nov 4 2016', concrete:'7.20'}]; 
 
var obj = {}; 
 
for(var index in b){ 
 
    obj[b[index]['Date']] = b[index]['steel']; 
 
} 
 
for(index in c){ 
 
    if(obj.hasOwnProperty(c[index]['Date'])){ 
 
    obj[c[index]['Date']] += c[index]['concrete']; 
 
    }else{ 
 
    obj[c[index]['Date']] = c[index]['concrete']; 
 
    } 
 
} 
 
var result = []; 
 
for(var key in obj){ 
 
    result.push({Date:key, val:obj[key]}); 
 
} 
 
console.log(result);
をあなたは、実際の日付を使用している場合は、 Dateオブジェクトを構築し、それらを比較するために getTimeを使用する必要があります

関連する問題