从另一个数组向数组添加随机且不存在的项目

时间:2018-07-06 13:43:43

标签: javascript

假设我们有一系列物品:

const arr1 = [22, 54, 67, 11, ...so on]

并清空一个:

let arr2 = []

我可以添加以下随机项:

arr2 = [...arr2, arr1[Math.floor(Math.random()*arr1.length)]]

但是如何从第一个数组到第二个数组中添加一个随机项,并且不应添加已经添加的项?

是的,我们可以在一些tmp变量中保留添加的索引,但这似乎不正确,我认为应该有不同的解决方案。

注意:数组散布是因为我需要添加包含一些事件的项目。 例如,用户单击按钮,新项目将被添加到第二个数组中,并且该数组可能包含已添加的元素

7 个答案:

答案 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 ]