在Javascript中使用数组作为值创建一个对象数组

时间:2017-04-27 00:26:20

标签: javascript arrays loops object reduce

这是我的阵列:

var input = [
    {
        date: '2017-07-19',
        number: 10
    },
    {
        date: '2017-07-20',
        number: 7.5
    },
    {
        date: '2017-07-20',
        number: 9
    },
    {
        date: '2017-07-21',
        number: 8
    },
    {
        date: '2017-07-22',
        number: 9.3
    },
    {
        date: '2017-07-22',
        number: 6
    },
    {
        date: '2017-07-23',
        number: 5.8
    },
    {
        date: '2017-07-23',
        number: 7.2
    },
    {
        date: '2017-07-24',
        number: 9
    }
];

这就是我想要完成的事情

 var output = [
    {
        date: '2017-07-19',
        number: [10],
        average: 10
    },
    {
        date: '2017-07-20',
        number: [10, 7.5, 9],
        average: 8.8
    },
    {
        date: '2017-07-21',
        number: [10, 7.5, 9, 8],
        average: 8.6
    },
    {
        date: '2017-07-22',
        number: [10, 7.5, 9, 8, 9.3, 6],
        average: 8.3
    },
    {
        date: '2017-07-23',
        number: [10, 7.5, 9, 8, 9.3, 6, 5.8, 7.2],
        average: 7.9
    },
    {
        date: '2017-07-23',
        number: [10, 7.5, 9, 8, 9.3, 6, 5.8, 7.2, 9],
        average: 7.9
    }
];

到目前为止,我只能添加具有相同日期的数字并计算数字的平均值。

var temp = {};
var obj = null;
for (i = 0; i < input.length; i++) {
    obj = input[i];
    if (!temp[obj.date]) {
        temp[obj.date] = obj;
    } else {
        temp[obj.date].number += obj.number;
    }
}
var counter = {};
for (i = 0; i < input.length; i += 1) {
    counter[input[i].date] = (counter[input[i].date] || 0) + 1;
}
for (var key in counter) {
    if (counter[key] > 1) {
    }
}
var out = [];
for (var date in temp)
    out.push(temp[date]);
var finalOutput = [];
for (i = 0; i < out.length; i++) {
    finalOutput.push({
        date: out[i].date,
        mean: Math.round(out[i].number / counter[out[i].date] * 10) / 10
    });
}
console.log(finalOutput);

但我不知道如何制作var output数组。 非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

&#13;
&#13;
function group(arr) {
    // FIRST PART: group the objects and sum their numbers
    var indexHash = {};                           // helps us check whether or not a date is encountered and at which index the object for that date is stored
    var output = arr.reduce(function(acc, o) {    // for each object o in the array
        var ind = indexHash[o.date];              // get the index for this date from the index hash (if any)
        if(ind) {                                 // if there is (there is already an object fro this date)
            acc[ind].number.push(o.number);       // then push this object's number to its array of numbers
            acc[ind].mean += o.number;            // add this object's number to it's mean (mean will serve as a sum for later when we will divide it by the length)
        }
        else                                      // otherwise (if we haven't store an object for this particular date) 
            indexHash[o.date] = acc.push({        // ... then store one
                "date": o.date,                   // that has its date equal to this object's date
                "number": [o.number],             // and that has its number array containing this object's number
                "mean": o.number                  // and that has its mean initialized with this object's number
            }) - 1;
        return acc;
    }, []);
    
    // SECOND PART: sort the array by date (if not necessary then remove this bit of code)
    output.sort(function(a, b) {
        a = new Date(a.date).getTime();       
        b = new Date(b.date).getTime();
        return a - b;
    });
    
    // THIRD PART: add the numbers of previous dates to the current date
    var first = output.shift(), last = first;     // remove the first item of the array and store it (so we can get it back into the array later) and use it as the last seen object
    output.forEach(function(o) {                  // then for each object o
        o.number = last.number.concat(o.number);  // concat the last seen object's numbers to this object's number
        o.mean += last.mean;                      // add the sum of the last seen object's numbers to this object's sum
        last = o;                                 // mark this object as the last seen object (so to add its numbers to the next object)
    });
    output.unshift(first);                        // get back the first object (previously removed) to the array
    
    // FORTH PART: calculate the mean
    output.forEach(function(o) {
        o.mean /= o.number.length;                // the mean property of each object represents the sum of its number, to get the actual mean we have to divide the sum by the length of the number array
    });
    
    return output;
}


var input = [{"date":"2017-07-19","number":10},{"date":"2017-07-20","number":7.5},{"date":"2017-07-20","number":9},{"date":"2017-07-21","number":8},{"date":"2017-07-22","number":9.3},{"date":"2017-07-22","number":6},{"date":"2017-07-23","number":5.8},{"date":"2017-07-23","number":7.2},{"date":"2017-07-24","number":9}];

console.log(group(input));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

以下内容应该有效:

function mean(numbers) {
  var sum = numbers.reduce(function(a, b) { return a + b; });
  return sum/numbers.length;
}

// Sort the input array by date
input.sort(function(a, b) {
            return new Date(a.date) - new Date(b.date);
            });

// Add the first data-point to the output array
var output = [{  date: input[0].date,
                 number: [input[0].number] }];

// Loop through the remaining input array elements
for (var i=1; i<input.length; i++) {

  var lastDate = output[output.length-1];

  if (input[i].date != lastDate.date) {
    // This is a new date
    // Calculate the average for the old date
    lastDate.average = mean(lastDate.number);

    // And create an output entry for the new date
    output.push( { date: input[i].date,
                   number: lastDate.number.concat([input[i].number]) });
    // Set the number array to the previous date's number array with the newest number concatenated onto it
    
  } else {
    // If there is already an output entry for this date, then just add the new number
    lastDate.number.push(input[i].number);
  }
}

// Calculate average for last date
lastDate = output[output.length-1];
lastDate.average = mean(lastDate.number);

console.log(output);