2017-02-28 28 views
1

をベースJSON配列の日付をマージ? :は、私は、このための解決策を見つけることができません

解決策を見つけようとしていますが、わかりません。

[ 
    { 
    "date" : "2010-01-01", 
    "price" : 30 
    }, 
    { 
    "date" : "2010-02-01", 
    "price" : 40 
    }, 
    { 
    "date" : "2010-03-01", 
    "price" : 50 
    }, 
    { 
    "date" : "2010-01-01", 
    "price2" : 45 
    }, 
    { 
    "date" : "2010-05-01", 
    "price2" : 40 
    }, 
    { 
    "date" : "2010-10-01", 
    "price2" : 50 
    } 
] 

私はこれ欲しい:

[ 
    { 
     "date" : "2010-01-01", 
     "price" : 30, 
     "price2" : 45 
    }, 
    { 
     "date" : "2010-02-01", 
     "price" : 40, 
     "price2" : null 
    }, 
    { 
     "date" : "2010-03-01", 
     "price" : 50, 
     "price2" : null 
    }, 
    { 
     "date" : "2010-05-01", 
     "price" : null, 
     "price2" : 40 
    }, 
    { 
     "date" : "2010-10-01", 
     "price" : null 
     "price2" : 50 
    } 
] 

は、事前にありがとうございます。

+0

あなたが第一及び第二の価格を区別する必要がありますか?あなたは同じ日に2つ以上の価格を決して持っていませんか?これらの質問に「いいえ」と答えた場合は、複数の「priceN」フィールドではなく「prices」配列を使用することをお勧めします – Aaron

答えて

0

最初にsort()メソッドを使用して日付で要素をソートし、次にforEach()を使用して要素を日付でグループ化することができます。あなたはをマージするループとObject.assignArray.reduceArray.mapを試すことができますArray.reduce()Array.find()

var prices = [{"date":"2010-01-01","price":30},{"date":"2010-02-01","price":40},{"date":"2010-03-01","price":50},{"date":"2010-01-01","price2":45},{"date":"2010-05-01","price2":40},{"date":"2010-10-01","price2":50}]; 
 

 
var prices2 = prices.reduce(function(acc, val) { 
 
    var dateElement = acc.find(function(element) { 
 
    return val.date === element.date; 
 
    }); 
 

 
    if (!dateElement) { 
 
    dateElement = { 
 
     date: val.date, 
 
     price: null, 
 
     price2: null, 
 
    }; 
 
    acc.push(dateElement); 
 
    } 
 
    dateElement.price = dateElement.price || val.price; 
 
    dateElement.price2 = dateElement.price2 || val.price2; 
 

 
    return acc; 
 
}, []); 
 

 
console.log(prices2);

0

var data = [{"date":"2010-01-01","price":30},{"date":"2010-02-01","price":40},{"date":"2010-03-01","price":50},{"date":"2010-01-01","price2":45},{"date":"2010-05-01","price2":40},{"date":"2010-10-01","price2":50}] 
 

 
var result = data.reduce((p, c) => 
 
    (p[c.date] = Object.assign({},{price: null, price2:null}, p[c.date], c)) && p 
 
    , {}); 
 

 
var final = Object.keys(result).map(x=>result[x]) 
 

 
console.log(final)

0

を使用して

var data = [{"date":"2010-01-01","price":30},{"date":"2010-02-01","price":40},{"date":"2010-03-01","price":50},{"date":"2010-01-01","price2":45},{"date":"2010-05-01","price2":40},{"date":"2010-10-01","price2":50}] 
 
data.sort((a, b) => new Date(a.date) - new Date(b.date)) 
 

 
var result = [] 
 
data.forEach(function(e) { 
 
    if(!this[e.date]) { 
 
    this[e.date] = {date: e.date, price: null, price2: null} 
 
    result.push(this[e.date]) 
 
    } 
 
    this[e.date] = Object.assign(this[e.date], e) 
 
}) 
 

 
console.log(JSON.stringify(result, 0, 4))

0

あなたが同じ日を基準としてオブジェクトを使用することができます。

var data = [{ date: "2010-01-01", price: 30 }, { date: "2010-02-01", price: 40 }, { date: "2010-03-01", price: 50 }, { date: "2010-01-01", price2: 45 }, { date: "2010-05-01", price2: 40 }, { date: "2010-10-01", price2: 50 }], 
 
    grouped = []; 
 

 
data.forEach(function (hash) { 
 
    return function (o) { 
 
     if (!hash[o.date]) { 
 
      hash[o.date] = { date: o.date, price: null, price2: null }; 
 
      grouped.push(hash[o.date]); 
 
     } 
 
     Object.keys(o).forEach(function (k) { 
 
      if (k === 'date') { 
 
       return; 
 
      } 
 
      hash[o.date][k] = o[k]; 
 
     }); 
 
    }; 
 
}(Object.create(null))); 
 

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

関連する問題