2017-02-28 77 views
1

我无法找到一个解决方案:合并JSON数组日期基于

我想 JSON数组基于一个塔(日期),并与排序它的JavaScript/jQuery的 ? :

我一直在寻找解决方案,但我无法弄清楚。

[ 
    { 
    "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

你需要在第一和第二价格之间的区别?你确定你在同一天不会有两个以上的价格吗?如果您对这些问题中的任何一个回答“否”,我建议使用“价格”数组而不是多个“priceN”字段 – Aaron

回答

0

您可以先使用sort()方法按日期对元素进行排序,然后您可以使用forEach()按日期对元素进行分组。

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

使用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

你可以尝试Array.reduceArray.map循环和Object.assign合并

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 }], 
 
    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; }