在Javascript中,如何将下一个对象减去上一个对象,并再次将我得到的值与其他下一个值相减等等


(14) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"}
1: {date: "2018-09-29", views: "69811", clicks: "361", likes: "5935"}
2: {date: "2017-12-30", views: "80107", clicks: "412", likes: "6526"}
3: {date: "2016-10-31", views: "88390", clicks: "445", likes: "6989"}

这是我的数组,我想用对象[1]减去对象[0],然后用我得到的值打印它,我想再减去之前用对象[2]得到的值,然后得到值,打印它,再用对象[3]减去它,以此类推,直到最后,然后在表中打印值。

我想要下面给出的数组的最终结果

0: {date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"}
1: {date: "2018-09-29", views: "35080", clicks: "153", likes: "2101"}
2: {date: "2017-12-30", views: "45027", clicks: "259", likes: "4425"}
3: {date: "2016-10-31", views: "43363", clicks: "186", likes: "2564"}

看起来您保持日期不变,并重复地从Object[1]中减去Object[0]中的值(反之亦然(。这是最容易做到的条目在适当的位置,像这样(见评论(:

const array = [
{date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"},
{date: "2018-09-29", views: "69811", clicks: "361", likes: "5935"},
{date: "2017-12-30", views: "80107", clicks: "412", likes: "6526"},
{date: "2016-10-31", views: "88390", clicks: "445", likes: "6989"},
];
// Start with the first entry
let lastEntry = array[0];
// Loop starting with the second entry
for (let index = 1; index < array.length; ++index) {
// Get the entry for this loop iteration
const entry = array[index];
// Subtract the previous values
entry.views -= lastEntry.views;
entry.clicks -= lastEntry.clicks;
entry.likes -= lastEntry.likes;
// Remember this entry for the next loop iteration
lastEntry = entry;
}
console.log(array);

但是,如果你想在一个新的数组中有一组新的对象,这并不是一个大的变化:

const original = [
{date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"},
{date: "2018-09-29", views: "69811", clicks: "361", likes: "5935"},
{date: "2017-12-30", views: "80107", clicks: "412", likes: "6526"},
{date: "2016-10-31", views: "88390", clicks: "445", likes: "6989"},
];
const result = [];
if (original.length) {
// Remember a copy of the first entry
result.push({...original[0]});
lastEntry = result[0];
for (let index = 1; index < original.length; ++index) {
// Get a copy of the original entry at this loop index
const entry = {...original[index]};
// Subtract the previous entry values
entry.views -= lastEntry.views;
entry.clicks -= lastEntry.clicks;
entry.likes -= lastEntry.likes;
// Save it
result.push(entry);
// Remember this for next time
lastEntry = entry;
}
}
console.log(result);

在那里,我使用ES2018+的属性扩展语法来对对象进行浅层复制。如果您需要针对比这更旧的环境,可以使用Object.assign(它在早期的ES2015中,很容易填充(:

const entry = Object.assign({}, original[index]});

或者你可以手动复制,结合数学:

const original = [
{date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"},
{date: "2018-09-29", views: "69811", clicks: "361", likes: "5935"},
{date: "2017-12-30", views: "80107", clicks: "412", likes: "6526"},
{date: "2016-10-31", views: "88390", clicks: "445", likes: "6989"},
];
const result = [];
if (original.length) {
// Remember a copy of the first entry
result.push({...original[0]});
lastEntry = result[0];
for (let index = 1; index < original.length; ++index) {
// Get a copy of the original entry at this loop index
const source = original[index];
const entry = {
date: source.date,
views: source.views - lastEntry.views,
clicks: source.clicks - lastEntry.clicks,
likes: source.likes - lastEntry.likes
};
// Save it
result.push(entry);
// Remember this for next time
lastEntry = entry;
}
}
console.log(result);

这里有一个使用reduce 的版本

注意:如果你不克隆原始项目,代码还会修改原始项目,这可能不是你想要的,并且有点破坏了使用reduce(forEach会更好(的原因

在这里我通过传播克隆-感谢TJ在这里给我上了一课

const original = [
{date: "2019-11-28", views: "34731", clicks: "208", likes: "3834"},
{date: "2018-09-29", views: "69811", clicks: "361", likes: "5935"},
{date: "2017-12-30", views: "80107", clicks: "412", likes: "6526"},
{date: "2016-10-31", views: "88390", clicks: "445", likes: "6989"},
];
const result = original.reduce((acc, _, i) => { // we do not use the current item
const item = {...original[i]} // IMPORTANT property spread copy or you will modify the original
if (i > 0) {
const prev   = acc.length - 1;
item.views  -= acc[prev].views;
item.clicks -= acc[prev].clicks;
item.likes  -= acc[prev].likes;
}
acc.push(item)
return acc
}, [])
console.log(result);
console.log(original);

相关内容

最新更新