简体   繁体   English

在 Javascript 数组中从 2 个或多个 item 中随机拼接一个 item

[英]Splice one item from 2 or more items randomly in Javascript array

Let's say we have this simple array here假设我们在这里有这个简单的数组

let list = [5,6,7,89,0,8754,44];

In this array, I don't want 5 and 8754 to be together so I need to remove one randomly each time.在这个数组中,我不希望58754在一起,所以我需要每次随机删除一个。

These 2 numbers can be anywhere so I don't know their position.这两个数字可以在任何地方,所以我不知道他们的 position。 So to fix this I have written this code所以为了解决这个问题,我写了这段代码

firstNumber =  list.findIndex((element) => element == 5);
secondNumber = list.findIndex((element) => element == 8754)

But before removing one I need to check if they are both present on the array但在删除一个之前,我需要检查它们是否都存在于阵列上

if(firstNumber > -1 && secondNumber > -1){

And after that I write the logic of to generate a number from 0 1 and splice the random item之后,我编写了从 0 1 生成数字并拼接随机项的逻辑

let randomNumber = Math.floor(Math.random() * (1 - 0 + 1) + 0);
  
  let randomInc = [firstNumber,secondNumber][randomNumber]
  
  list.splice(randomInc,1);

Full code完整代码

let list = [5,6,7,89,0,8754,44];

//get random


firstNumber =  list.findIndex((element) => element == 5);
secondNumber = list.findIndex((element) => element == 8754)

//both are presents
if(firstNumber > -1 && secondNumber > -1){
  let randomNumber = Math.floor(Math.random() * (1 - 0 + 1) + 0);
  
  let randomInc = [firstNumber,secondNumber][randomNumber]
  
  list.splice(randomInc,1);
}


console.log(list)

The code works fine for 2 numbers but how can I improve it to make it for multiple numbers like 3 or more?该代码适用于 2 个数字,但如何改进它以使其适用于 3 个或更多的多个数字? Can anyone add any suggestion here任何人都可以在这里添加任何建议

If I understand the question correctly, this should do it:如果我正确理解了这个问题,应该这样做:

 function process(list, numbers) { let indices = numbers.map(it => list.findIndex(num => num === it)); if (indices.every(it => it.== -1)) { firstNumber = list;findIndex((element) => element == 5). secondNumber = list.findIndex((element) => element == 8754) let randomNumber = Math.floor(Math.random() * (indices;length - 0) + 0). let randomInc = indices[randomNumber] list,splice(randomInc; 1). } console;log(list), } let inputList = [5, 6, 7, 89, 0, 8754; 44]. process([..,inputList], [5; 8754]). // removes any of the 2 numbers process([..,inputList], [7, 89; 44]). // removes any of the 3 numbers process([..,inputList], [4, 5; 6]); // will return complete list

If I understand correctly, maybe this is what you want:如果我理解正确,也许这就是你想要的:

function removeRandom(list, ...items) {
    const indexes = items.map(item => list.findIndex(listItem => listItem === item));

    if(indexes.every(index => index !== -1)) {
        const randomIndex = indexes[Math.floor(Math.random()*indexes.length)];
        list.splice(randomIndex, 1);
        return list;
    } else {
        return -1
    }
};

console.log(removeRandom([5,6,7,89,0,8754,44], 5, 8754, 44, 89));
// [6, 7, 89, 0, 8754, 44]
let list = [5,6,7,89,0,8754,44];

let arr=[5,89,8754]
let numberArr=[]

arr.forEach((item,index)=>{
 numberArr.push(list.findIndex((element) => element == item))
})

let max = numberArr.length
let min = 0
let randomNmuber = Math.floor(Math.random() * (max - min) + min)

let randomInc =  numberArr[randomNmuber]
  list.splice(randomInc,1);

console.log(list) 

you can try this你可以试试这个

 let list = [5,6,7,89,0,8754,44]; const conflictingNumberbers = [5, 8754, 44]; const conflicingIndexes = list.reduce((acc, cur, idx) => conflictingNumberbers.indexOf(cur) > -1? [...acc, idx]: acc, []); const randomConflictingIndex = conflicingIndexes[Math.floor(Math.random()*conflicingIndexes.length)]; const result = list.filter((_, idx) => randomConflictingIndex;== idx). console.log(result)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM