Найти первое уникальное значение в массиве или строке - PullRequest
0 голосов
/ 31 октября 2018

Как я могу получить одно уникальное значение в массиве или строке? Только первое значение . Только для JS.

Мой пример:

function searchValue () {
  let inputText = [1,1,4,2,2,2,3,1];
  let foundedValue;
  for (let i = 0; i < inputText.length; i++) {
    if (i === inputText.indexOf(inputText[i]) && i === inputText.lastIndexOf(inputText[i])) {
      foundedValue = inputText[i];
      break;
    } else {
      foundedValue = "not founded.";
    }
  }
  return foundedValue;
}
console.log("Search value: "+ searchValue())

Ответ - 4.

Но мне нужно короткое решение. Использование функций find() и filter().

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вы можете попробовать это.

const arr = [1, 1, 4, 2, 2, 2, 3, 1];
let r = {};
arr.map(a => r[a] = (r[a] || 0) +1)
var res = arr.find(a => r[a] === 1 )
console.log(res)
0 голосов
/ 02 ноября 2018

Вы можете использовать объект js Set (). Сначала вы можете создать набор дублированных элементов.

const inputText = [1,1,4,2,2,2,3,1];

const duplicatesSet= inputText.reduce((dupSet, el) => 
    inputText.filter(arrEl => arrEl === el).length > 1 ?
      dupSet.add(el) : dupSet
, new Set());

Во-вторых, вы можете использовать array.find. Возвращает первый дублированный элемент.

const firstDupElement = inputText.find(el => duplicatesSet.has(el));
0 голосов
/ 01 ноября 2018

Вы можете найти первый уникальный элемент в вашем массиве, используя find() и сравнив indexOf с lastIndexOf, чтобы определить, существует ли более одного экземпляра элемента. Если вам нужно найти уникальные символы в строке, вы можете сначала разбить ее на массив, а затем использовать тот же подход. Например:

const arr = [1, 1, 4, 2, 2, 2, 3, 1];

let result = arr.find(x => arr.indexOf(x) === arr.lastIndexOf(x));
console.log(result);
// 4

const text = 'aadbbbca';

let textarr = text.split('');
let textresult = textarr.find(x => textarr.indexOf(x) === textarr.lastIndexOf(x));
console.log(textresult);
// d

В зависимости от характера вашего ввода может быть выигрыш в производительности при удалении дубликатов из массива перед выполнением find(). Вы можете вернуть массив без дубликатов различными способами. Например:

// use spread operator and Set to remove duplicates
let dedup = [...new Set(arr)];
// or use filter to return only the first occurence of each item
// let dedup = arr.filter((item, index) => arr.indexOf(item) === index);

let result = dedup.find(x => arr.indexOf(x) === arr.lastIndexOf(x));
...