如何使用javascript按日分开数组列表在单独的数组中

时间:2018-01-23 07:47:38

标签: javascript lodash

如何按天划分数组列表

const days = [
    {'name':'Mon','value':1}, 
    {'name':'Tue','value':5},
    {'name':'Wed','value':10},
    {'name':'Wed','value':30},
    {'name':'Fri','value':18},
    {'name':'Sat','value':80},
    {'name':'Sat','value':90},
    {'name':'Sun','value':20},
]

我有上面的数组列表我结婚周六我有两个值 thu 我没有值。我需要将重复的键值拆分为单独的数组,如果列表中没有日期我需要添加零值,例如我的输出将是

const result = [
  [1,5,10,0,18,80,20],
  [0,0,30,0,0,90,0]
]

我需要这样的结果是可以用javascript做的。

5 个答案:

答案 0 :(得分:2)

您可以使用unit javascript。

执行此操作

算法非常简单:

  1. 对于native中的每一天,您应该在给定的数组中进行搜索,并daysArray remove首次出现days

  2. 执行步骤 1直到days为空。换句话说,执行步骤1直到满足days.length == 0条件。

  3. let days = [ {'name':'Mon','value':1}, {'name':'Tue','value':5}, {'name':'Wed','value':10}, {'name':'Wed','value':30}, {'name':'Fri','value':18}, {'name':'Sat','value':80}, {'name':'Sat','value':90}, {'name':'Sun','value':20} ], daysArray = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
    let result = [];
    while(days.length){
      sub_array = [];
      daysArray.forEach(function(item){
         let index = days.findIndex(a => a.name == item);
         if(index == -1)
             sub_array.push(0);
         else{
             sub_array.push(days[index].value);
             days.splice(index, 1); 
         }  
      });
      result.push(sub_array);
    }
    console.log(result);

答案 1 :(得分:2)

按照您想要的顺序添加一系列天数 - daysList

使用名称作为关键字daysMap将日期对象分组为Map

Reduce daysList,并在当天获取地图中的日期对象。使用Array.forEach()迭代一系列天数,并为每个添加一周数组filled,如果缺少则为0,并将日期值指定为日期索引di



const daysList = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

const days = [{"name":"Mon","value":1},{"name":"Tue","value":5},{"name":"Wed","value":10},{"name":"Wed","value":30},{"name":"Fri","value":18},{"name":"Sat","value":80},{"name":"Sat","value":90},{"name":"Sun","value":20}]

// group the days by name into a map
const daysMap = days.reduce((m, o) => {
  m.has(o.name) || m.set(o.name, [])
  
  m.get(o.name).push(o)

  return m
}, new Map)

// iterate the daysList
const result = daysList.reduce((r, d, di) => {
  //get the array of the days with the same name from the group
  const daysObjs = daysMap.get(d) || []
  
  //iterate the daysObjs array
  daysObjs.forEach(({ name, value }, wi) => {
    // add a new week array filled with 0 if the row is missing
    r[wi] || r.push(new Array(daysList.length).fill(0))
    
    // assign the day value to the week array
    r[wi][di] = value
  })
  
  return r
}, [])

console.log(result)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您可以为日期索引和ouiter indixec获取一个对象,该对象由每个数据插入递增。

&#13;
&#13;
var days = [{ name: 'Mon', value: 1 }, { name: 'Tue', value: 5 }, { name: 'Wed', value: 10 }, { name: 'Wed', value: 30 }, { name: 'Fri', value: 18 }, { name: 'Sat', value: 80 }, { name: 'Sat', value: 90 }, { name: 'Sun', value: 20 }],
    indices = { Mon: { day: 0, index: 0 }, Tue: { day: 1, index: 0 }, Wed: { day: 2, index: 0 }, Thu: { day: 3, index: 0 }, Fri: { day: 4, index: 0 }, Sat: { day: 5, index: 0 }, Sun: { day: 6, index: 0 } },
    result = days.reduce((r, { name, value }) => {
        r[indices[name].index] = r[indices[name].index] || Array.from({ length: 7 }).fill(0);
        r[indices[name].index++][indices[name].day] = value;
        return r;
    }, []);
   
console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您可以使用array#reduce和一天的查找对象,并根据指定日期创建一个value数组。

&#13;
&#13;
const days = [{'name':'Mon','value':1}, {'name':'Tue','value':5}, {'name':'Wed','value':10}, {'name':'Wed','value':30}, {'name':'Fri','value':18}, {'name':'Sat','value':80}, {'name':'Sat','value':90}, {'name':'Sun','value':20}, ],
  day = {'Mon':0, 'Tue':1, 'Wed':2, 'Thu': 3, 'Fri': 4, 'Sat': 5, 'Sun': 6},
  result = days.reduce((r,o) => {
    var index = 0;
    if(r[index][day[o.name]]) {
      while(r[index] && r[index][day[o.name]]) {
        index++;
      }
      if(!r[index]) {
        r[index] = Array.from({length: 7}, _=> 0);
      }
    } 
    r[index][day[o.name]] = o.value;
    return r;
},[Array.from({length: 7}, _=> 0)]);
console.log(result);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

另一种解决方案:

const res = _.chain(days)
    .map('name') // get days name
    .uniq() // uniq days name
    .map(day => _.filter(days, { name: day })) // iterate days name and get all day items
    .map(sameDays => _.map(sameDays, 'value')) // get value for each day items
    .map(vs => [vs[0], vs[1] || 0]) // set 0 value if only one item for day
    .thru(_.spread(_.zip)) // transpose the array
    .value()