假设我们有一系列物品:
const arr1 = [22, 54, 67, 11, ...so on]
并清空一个:
let arr2 = []
我可以添加以下随机项:
arr2 = [...arr2, arr1[Math.floor(Math.random()*arr1.length)]]
但是如何从第一个数组到第二个数组中添加一个随机项,并且不应添加已经添加的项?
是的,我们可以在一些tmp变量中保留添加的索引,但这似乎不正确,我认为应该有不同的解决方案。
注意:数组散布是因为我需要添加包含一些事件的项目。 例如,用户单击按钮,新项目将被添加到第二个数组中,并且该数组可能包含已添加的元素
答案 0 :(得分:1)
如果可以突变arr1
(如Matt Burland在评论中建议的那样),请尝试以下操作:
arr2 = [...arr2, ...arr1.splice(Math.floor(Math.random()*arr1.length), 1]);
splice
将从arr1
中删除该项目,并返回删除的项目,准备将其添加到arr2
中!
如果您无法更改它,只需在使用此行之前进行克隆即可!
希望这对您有帮助:)
答案 1 :(得分:1)
我认为您正在寻找这样的东西:
const arr1 = [22, 54, 67, 11, 23, 56, 43, 77, 34, 76, 30]
let arr2 = []
function addRandom() {
if(new Set(arr1).size === arr2.length) return; //prevention from infinite loop
// if(arr1.length=== arr2.length) return; // if arr1 doesn't contain duplicates
let random = arr1[Math.floor(Math.random()*arr1.length)];
if (!arr2.includes(random)) {
arr2.push(random);
} else {
addRandom();
}
}
addRandom();
console.log(arr2);
addRandom();
console.log(arr2);
addRandom();
console.log(arr2);
如果您确定arr1
将不包含重复项,则将(new Set(arr1).size === arr2.length)
替换为arr1.length=== arr2.length
。
答案 2 :(得分:1)
您可以创建自定义逻辑,以将随机值压入arr2
,这样的条件是数字必须在arr2
中是唯一的,并且直到{{ 1}}:
arr1
答案 3 :(得分:0)
您可以在第二个数组上使用include
函数,并检查要添加的元素是否不存在。
let randomItem = arr1[Math.floor(Math.random()*arr1.length)];
while(arra2.includes(randomItem)) {
randomItem = arr1[Math.floor(Math.random()*arr1.length)];
}
arr2.push(randomItem);
答案 4 :(得分:0)
如果兼容性不是问题,则可以使用数组集。
var arr1 = [44, 55, 100];
var arr2 = [44, 55, 100];
var arr3 = [...new Set(arr1, arr2)];
答案 5 :(得分:0)
类似的事情应该起作用
{
"kind": "youtube#videoListResponse",
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/q1X2B1932H2A6Az8KDm_LQxz62c\"",
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
},
"items": [
{
"kind": "youtube#video",
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/ZQMr9x4Jyv8XjT9IF6WYDNod-bc\"",
"id": "nj1TosUqJCI",
"statistics": {
"viewCount": "9187",
"likeCount": "93",
"dislikeCount": "5",
"favoriteCount": "0",
"commentCount": "27"
}
}
]
}
这也使您可以保留第一个数组的原始顺序。
答案 6 :(得分:0)
@WebArtisan ,您也可以尝试以下代码。
// Function that returns a randomly selected unique list of items from another
// array with duplicated items
function getUniqueRandomItems(arr1) {
let arr2 = [];
while(arr1.length) {
// A random number in range [0, arr1.length-1]
randomIndex = Math.floor((Math.random() * (arr1.length)) + 1) - 1;
// Removing 1 item from random index in range
removedItem = arr1.splice(randomIndex, 1)[0];
// If removedItem does not exist then add it to arr1
if(arr2.indexOf(removedItem) < 0) {
arr2.push(removedItem);
}
}
return arr2 // Return the result array with unique random items
}
/************ TEST 1****************************************/
const arr1 = [22, 54, 67, 11, 54, 22, 67, 11, 88, 90, 54, 2, 3, 2, 11, 54, 0];
const arr2 = getUniqueRandomItems(arr1);
console.log(arr2); // [ 2, 22, 88, 67, 54, 11, 3, 90, 0 ]
/************ TEST 2****************************************/
const arr3 = [1, 5, 2, 5, 1, 3, 3, 6, 3, 1, 9, 8, 10, 9, 7, 4, 3, 4, 2, 1, 10];
const arr4 = getUniqueRandomItems(arr3);
console.log(arr4); // [ 1, 7, 9, 10, 5, 3, 2, 8, 4, 6 ]