Javascript: нет повторяющегося массива случайных строк - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь удалить дубликаты из этого массива генератора случайных чисел. Я пробовал много разных строк кода, которые могли бы удалить дубликаты, но я не смог заставить что-либо работать.

пример того, что я использовал:

        filtered = idArray.filter(function (str) { return str.indexOf(idArray) === -1; });

Код:

     var idArray = ['img1', 'img2'];
        var newID=getRandomInt(2);
        var newCube=idArray[newID];
        document.getElementById(""+newCube+"").src="assets/button-yellow_x64.png";
        document.getElementById(""+newCube+"").src="assets/button-yellow_x64.png"; 

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Использование наборов - новый и лучший ответ, но если вы все еще хотите реализовать свое требование, вы можете использовать хеш объекта для отслеживания элементов, а затем просто получить ключи. Например:

var idArray = ["img1", "img2", "img1", "img2"]
var hash = {}
idArray.forEach(id => hash[id] = true)
var ids = Object.keys(hash)
console.log(ids)
0 голосов
/ 03 мая 2018

Для удаления двойников вы можете сделать следующее:

//remove doubles from an array of primitive values
console.log(
  "no doubles primitive values",
  [1,2,3,4,3,4,5,6,7,7,7,8,9,1,2,3,4].filter(
    (value,index,all)=>all.indexOf(value)===index
  )
);
//remove doubles from an array of references you can do the same thing
const one = {id:1}, two = {id:2}, three = {id:3};
console.log(
  "no doubles array of references",
  [one,two,one,two,two,one,three,two,one].filter(
    (value,index,all)=>all.indexOf(value)===index
  )
);
//remove doubles from an array of things that don't have the same reference
//  but have same values (say id)
console.log(
  "no doubles array of things that have id's",
  [{id:1},{id:1},{id:1},{id:2},{id:3},{id:2}].reduce(
    ([all,ids],item,index)=>
      [ all.concat(item), ids.concat(item.id) ],
    [[],[]]
  ).reduce(
    (all,ids)=>
      all.filter(
        (val,index)=>ids.indexOf(val.id)===index
      )
  )
);

Или вы можете просто создать перетасованный массив без двойных чисел:

const shuffle = arr => {
  const recur = (result,arr) => {
    if(arr.length===0){
      return result;
    }
    const randomIndex = Math.floor(Math.random() * arr.length);
    return recur(
      result.concat([arr[randomIndex]]),
      arr.filter((_,index)=>index!==randomIndex)
    );
  };
  return recur([],arr);
}
const array = [1,2,3,4,5];
const shuffled = shuffle(array);
console.log("array is:",array,"shuffled array is:",shuffled);
0 голосов
/ 03 мая 2018

Вы можете использовать Set в новом ES6, который будет фильтровать избыточные элементы и Typecast, которые позже в массиве.

var idArray = ["img1", "img2", "img1", "img2"];
var distinctArray = [...new Set(idArray)];
console.log(distinctArray);
...