Javascript:将对象数据推入数组中的特定索引,并将零推入其余索引

时间:2020-02-10 11:19:08

标签: javascript sorting

在Array的特定索引上插入对象数据时遇到一个小问题。

这是我的JSON

let arr = [ 
        {"days":3, "count" : 10 },
    {"days":4, "count" : 12 },
    {"days":7, "count" : 14 },
    {"days":9, "count" : 20 }

]

输出,我想拥有。

updatedArr = [ 
             {"days":0, "count" : 0 },
             {"days":0, "count" : 0 },
             {"days":3, "count" : 10 },
             {"days":4, "count" : 12 },
             {"days":0, "count" : 0 },
             {"days":6, "count" : 34 },
]

因此,基本上我希望基于称为 days 的键将对象数据推入特定的索引。

如果 days 的值大于5,则它将是所有 days 值的总和,然后将其推到最后一个索引,例如第五索引。

这是我尝试过的代码。

let arr = [{
    "days": 3,
    "count": 10
},
{
    "days": 4,
    "count": 12
},
{
    "days": 7,
    "count": 14
},
{
    "days": 9,
    "count": 20
}

]

for (let index = 0; index < 6; index++) {
const element = arr[index];


let eachObject = {}

eachObject.count = 0


if (element && element !== undefined && element.days && element.days <= 5) {

    eachObject.days = element.days
    eachObject.count = element.count

    arr.splice((element.days - 1), 0, eachObject)

} else if (element && element !== undefined && element.days > 5) {

    eachObject.days = element.days
    eachObject.count += Number.parseInt(element.count)

    arr.splice(4, 0, eachObject)
} else {
    eachObject.days = 0
    eachObject.count = 0
    arr.push(eachObject)
}

}

任何帮助都会很棒。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以建立一个具有空计数的新数据集,并使用数组中的实际值更新它们。

让我们从累加器开始。

这是一个新数组,它使用Array.from个项,该项的长度为6,并且对象的映射具有dayscount属性。

Array#reduce接受一个数组和一个 startValue ,并为每个元素返回更改后的累加器。

在回调内部,对days属性进行了调整,以获取更大的价值。

该元素的某些属性发生了更新。最后,返回累加器r

let array = [{ days: 3, count: 10 }, { days: 4, count: 12 }, { days: 7, count: 14 }, { days: 9, count: 20 }],
    maxDays = 6,
    result = array.reduce(
        (r, { days, count }) => {
            days = Math.min(days, maxDays);
            r[days - 1].days = days;
            r[days - 1].count += count;
            return r;
        },
        Array.from({ length: maxDays }, () => ({ days: 0, count: 0 }))
    );

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