Javascript 基于先前指定给先前对象的值,将值指定给“关键点”对象

Javascript 基于先前指定给先前对象的值,将值指定给“关键点”对象,javascript,arrays,Javascript,Arrays,我有一个对象数组,需要根据之前分配给以前对象的宽度为它们指定宽度值。宽度是预定义的,数组中每四个项目的宽度加起来需要达到100%,我使用的宽度如下所示: 15%, 25%, 35%, 45% 因此,只有某些组合才能确保每一行的总和达到100%,我知道如何循环数组并为每个对象指定一个随机宽度值,只是不知道如何确保每一行等于100% 可能的行组合包括: 15%, 15%, 25%, 45% ------------------ 15%, 25%, 25%, 35% ----------------

我有一个对象数组,需要根据之前分配给以前对象的宽度为它们指定宽度值。宽度是预定义的,数组中每四个项目的宽度加起来需要达到100%,我使用的宽度如下所示:

15%, 25%, 35%, 45%
因此,只有某些组合才能确保每一行的总和达到100%,我知道如何循环数组并为每个对象指定一个随机宽度值,只是不知道如何确保每一行等于100%

可能的行组合包括:

15%, 15%, 25%, 45%
------------------
15%, 25%, 25%, 35%
------------------
25% + 25% + 25% + 25% (ideally would like to prevent this too to keep the rows as uneven as possible)
到目前为止,我有以下可能大小的数组和一个循环函数,它随机选择一个大小并分配它

    const tiles = [{id: 1, aspectRatio: ''}, {id: 2, aspectRatio: ''}, {id: 3, aspectRatio: ''}, {id: 4, aspectRatio: ''}, {id: 5, aspectRatio: ''}, {id: 6, aspectRatio: ''}, {id: 7, aspectRatio: ''}, {id: 8, aspectRatio: ''}
    const possibleSizes = ['15%', '25%', '35%', '45%'];
    let rowSizes = [];
    tiles.forEach((tile) => {
        const tileSize = sizes[Math.floor(Math.random() * sizes.length)];
        tile.aspectRatio = tileSize;
        if (rowSizes.length <= 3) {
            rowSizes.push(tileSize);
        } else {
            rowSizes = [];
        }
        console.log('rowSizes', rowSizes);
        console.log('tile', tile);
    });
const tiles=[{id:1,aspectRatio:'},{id:2,aspectRatio:'},{id:3,aspectRatio:'},{id:4,aspectRatio:'},{id:5,aspectRatio:'},{id:6,aspectRatio:'},{id:7,aspectRatio:'},{id:8,aspectRatio:'}
const possibleSizes=['15%,'25%,'35%,'45%];
让rowSizes=[];
tiles.forEach((tile)=>{
const tileSize=size[Math.floor(Math.random()*size.length)];
tile.aspectRatio=tileSize;

如果(rowSizes.length假设只有四列,我想我应该从以下内容开始:

15%, 15%, 15%, 15%
这使得我们总共有60%,剩下40%可以在这些栏目中分享。我会在一个随机栏目中分享4乘以10%

这样就可以了。在代码中:

const sizes = [15, 15, 15, 15];
for (i = 0; i < 4; i++) {
   sizes[Math.floor(Math.random() * 4)] += 10;
}
console.log('sizes', sizes);
const size=[15,15,15,15];
对于(i=0;i<4;i++){
尺寸[Math.floor(Math.random()*4)]+=10;
}
console.log('大小',大小);
请注意,我使用数字而不是字符串。我认为这没有问题,因为您可以轻松地将它们转换为百分比字符串


但是,请注意:您很少会得到一列55%的结果。如果您不想排除这些结果,就像您排除
[25,25,25,25]
结果一样。

排除其他信息(这感觉像是一个家庭作业),这似乎是一个很好的例子,用你的宽度代替硬币

鉴于这是一个众所周知的问题,而且有文档记录,而且网上的解释比我能提供的更好,我将不详细介绍

另一种解决方案可能是使用递归——编写一个循环遍历所有可能值的函数,然后调用该函数的另一个实例。返回条件是达到100%宽度,或者不超过100%就不能添加任何可能的元素


编辑:在编辑原始问题之前发布此答案。

您尝试了什么?@iwaduarte目前我正在循环对象并将分配给每个对象的宽度值存储在一个单独的数组中,但我不知道如何引用该数组以确保分配的值总和达到100。您的条件是:“宽度是预定义的,阵列中每四个项目的宽度加起来需要达到100%“,但你也说,
15%、15%、15%、15%、15%、15%、25%
是一个潜在的行组合。这两个不可能都是真的。抱歉@KIKOSoftware这是我的错误,你是对的,这不是一个可能的组合,因为一行中的项目太多,问题已更新检查你的代码,我得到一个错误:“tiles未定义”。不是家庭作业。以前没有听说过硬币兑换问题,我会检查一下!谢谢。我认为问题可能不清楚,列宽必须是预定义的大小之一(15%、25%、35%或45%),基本上它需要确定是否已经设置了两个15%的列,接下来的两个将需要25%和45%,或者如果设置了两个25%的列,剩下的两个将需要15%和35%等等@Stuart:我想我确实理解了这个问题。试着运行代码。当我这样做时,我会得到如下结果:
[25,15,35,25]
[45,15,25,15]
[35,25,15,25]
有什么问题吗?KIKO道歉,表示我的无知,你是100%对的,谢谢你的解决方案!