【问题标题】:Create stacked array with javascript使用 javascript 创建堆叠数组
【发布时间】:2014-08-05 11:02:41
【问题描述】:

我有一个原始的二维数组,它代表每年 100% 的版本预算,看起来像:

budget = [['2001-01-01', 100], ['2001-01-02', 110], ... , ['2001-12-31', 140]]

现在我需要为项目创建预算子数组。例如:

project1 = [['2001-01-01', 10], ['2001-01-02', 11]]

意思是,它持续 2 天并使用 10% 的可用预算。

我通过以下函数创建项目数组:

project1 = [[]];
project1 = new_project(budget, 0, 1, 0.1);

function new_project(origin, start, end, factor) {
    var result = [[]];
    result = origin.slice(parseInt(start), parseInt(end)).map(function (item) {
        return [item[0], parseInt(item[1]) * factor]
    });
    return result;
}

问题

我现在如何通过我创建的项目的值来减少我的预算数组? 我需要通过调用 new_project 即时修改预算以获得:

budget = [['2001-01-01', 90], ['2001-01-02', 99],..., ['2001-12-31', 140]]

jsfiddle 设置

http://jsfiddle.net/gcollect/7DAsL/

【问题讨论】:

  • 你为什么在'start'、'end'和'item[1]'参数上调用parseInt?你不需要这样做。
  • 你是对的。有时 start 由 year/12 定义。年是 365。年 /12 给我 30,41 .. 这就是为什么
  • 那么您想过滤掉一些预算数组成员,这些成员是否在 new_project 结果中?
  • 我想通过项目数组的第二个元素减少预算数组的第二个元素。
  • 所以会是 ['2001-01-02', 99]?

标签: javascript arrays multidimensional-array slice


【解决方案1】:

您可以使用内置数组forEach() 方法循环预算子集(即project1)并更改原始预算的值。我已经创建了一个名为 decreaseBudget() 的函数,它会为你做这件事:

function decreaseBudget(original, subset) {
    // Loop over the subset's items.
    subset.forEach(function(item, index){
        // Get the original amount out of the original item.
        // As we are looping over subset it will always have less items then the original 
        // so no need to check if the index is valid.
        var originalItemAmount = original[index][1];
        // Decrease the amount and set it back in it's original place
        original[index][1] = (originalItemAmount - item[1]); 
    });
};

使用budgetproject1 数组作为参数调用它以更改budget 数组的值。看看更新的小提琴: http://jsfiddle.net/7DAsL/4/

如果您更喜欢 decreaseBudget() 不会更改原始数组而是返回一个副本,您可以使用数组 .slice() 方法制作原始副本的浅层副本,对副本进行更改并返回它。

【讨论】:

    【解决方案2】:

    我得到了答案。见http://jsfiddle.net/gcollect/7DAsL/2/

    解决方案

        function new_project(origin, start, end, factor) {
            var result = [
                []
            ];
    
            result = origin.map(function (item) {
                return [item[0], (item[1] * factor)]
            });
            for (var i = 0; i < result.length; i++) {
                origin[i][1] = parseInt(origin[i][1]) - parseInt(result[i][1]);
            }
            result = origin.slice(parseInt(start), parseInt(end));
            return result;
    
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多