加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

聚合JavaScript数组的对象值?

发布时间:2020-12-14 04:54:58 所属栏目:百科 来源:网络整理
导读:在 JavaScript中,给定n个数组作为此格式的输入:(n = 2) array1:[{x: 1,y: 5},{x: 2,y: 3},{x: 3,y: 6}]array2:[{x: 1,y: 2},y: 6},y: 2}] 如何轻松聚合Y值并获得此结果数组: arrayOutput:[{x: 1,y: 7},y: 9},y: 8}] 谢谢. 解决方法 更新:关于x值及其在阵
在 JavaScript中,给定n个数组作为此格式的输入:(n = 2)

array1:
[{x: 1,y: 5},{x: 2,y: 3},{x: 3,y: 6}]

array2:
[{x: 1,y: 2},y: 6},y: 2}]

如何轻松聚合Y值并获得此结果数组:

arrayOutput:
[{x: 1,y: 7},y: 9},y: 8}]

谢谢.

解决方法

更新:关于x值及其在阵列中的位置的附加注释使得下面的内容无关紧要.

没有特别的技巧,你只需循环遍历数组并构建结果.它只不过是一个嵌套循环.如果您想在各种JavaScript引擎中实现最高效率,请避免不必要的函数调用.

有点像:

function sumYValues(arrays) {
    var outer,inner,array,entry,sum,result,x;

    // Create our result array with a copy of the first array
    result = [];
    if (arrays.length > 0) {
        array = arrays[0];
        for (inner = 0; inner < array.length; ++inner) {
            entry = array[inner];
            result[inner] = {x: entry.x,y: entry.y};
        }

        // Add in the remaining values
        for (outer = 1; outer < arrays.length; ++outer) {
            array = arrays[outer];
            // You might want an assert here verifying that result.length == array.length
            for (inner = 0; inner < array.length; ++inner) {
                entry = array[inner];
                // You might want an assert here verifying that result[inner].x == entry.x
                result[inner].y += entry.y;
            }
        }
    }

    return result;
}

这些循环从0(或1)计数到array.length – 1.您可能会分析是否向后(array.length – 1到0(或1))更快,大多数是“降到0”.我曾经认为这是因为当我是一个新面孔的年轻人时它在C中(与0的比较比与另一个变量的比较更快),但这种假设在JavaScript中可能有效,也可能无效.

没有特别的捷径,你只需遍历数组,进行比较,然后建立结果.

如果x值在每个数组中都是唯一的,则可以通过使用对象而不是数组并使用x值作为键来跟踪正在进行的总和,然后在完成后将其转换为数组.例如.:

function sumYValues(arrays) {
    var outer,ar,x;

    sum = {};
    for (outer = 0; outer < arrays.length; ++outer) {
        ar = arrays[outer];
        for (inner = 0; inner < arrays.length; ++inner) {
            entry = ar[inner];
            sum[entry.x] = (sum[entry.x] || 0) + entry.y;
        }
    }

    result = [];
    for (x in sum) {
        result.push({x: x,y: sum[x]});
    }

    return result;
}

以上主要是为了演示使用sum,一个对象,作为x =>的映射. y值,虽然它确实实现了至少一些求和逻辑.

这条线可能需要一些解释:

sum[entry.x] = (sum[entry.x] || 0) + entry.y;

如果sum没有该x值的条目,则sum [entry.x]将是未定义的,这是一个“falsey”值.因此,我们使用curiously-powerful || operator从sum或0获取该x的值,然后将当前条目的y添加到其中并存储结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读