programing

C# HashSet에 해당하는 JavaScript는 무엇입니까?

i4 2023. 8. 9. 20:30
반응형

C# HashSet에 해당하는 JavaScript는 무엇입니까?

저는 수천 개의 정수 키 목록을 가지고 있습니다.이 목록에서 제가 해야 할 일은 주어진 값이 목록에 있는지 여부를 말하는 것입니다.

C#의 경우 다음을 사용합니다.HashSet빨리 찾을 수 있도록 말입니다.자바스크립트에 해당하는 것은 무엇입니까?


최소 지원 수준: IE 9+, jQuery(현재)

실제로 JavaScript는 Set 객체를 제공하며 사용하기 매우 간단합니다.

var set = new Set();
set.add(1);
set.add(2);

set.has(1)    // true

안타깝게도 IE9과 호환되지 않습니다.

후드 아래에서 JavaScript Object는 해시 테이블과 함께 구현됩니다.그래서, 당신의Key:Value짝이 될 것입니다.(your integer):true

상수 시간 조회 기능은 다음과 같이 구현될 수 있습니다.

var hash = {
  1:true,
  2:true,
  7:true
  //etc...
};

var checkValue = function(value){
  return hash[value] === true;
};


checkValue(7); // => true
checkValue(3); // => false

개체를 사용합니다.세트에 키를 추가하려면 다음을 수행합니다.

object[key] = true;

키가 세트에 있는지 테스트하려면 다음을 수행합니다.

if (object.hasOwnProperty(key)) { ... }

세트에서 키를 제거하려면 다음을 수행합니다.

delete object[key]

일반 JavaScript 개체와 'in' 키워드만 사용하여 해당 개체에 특정 키가 있는지 확인할 수 있습니다.

var myObj = {
  name: true,
  age: true
}

'name' in myObj //returns true;
'height' in myObj // returns false;

또는 JavaScript 개체 속성에 내장되어 있을 수 있는 키가 개체에 있을 경우 다음을 사용합니다.

var myObj = {
  name: true,
  age: true
}

myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;

저는 해결책을 읽고 몇 가지를 시도했습니다.사용을 시도한 후object[key]방법 나는 그것이 작동하지 않을 것이라는 것을 깨달았습니다.HTML 요소를 저장할 수 있는 해시셋을 원했습니다.이러한 개체를 추가할 때key문자열로 번역이 되어서 jQuery를 기반으로 한 저만의 세트를 생각해요.지원합니다.add,remove,contains그리고.clear.

var HashSet = function () {

    var set = [];

    this.add = function (obj) {
        if (!this.contains(obj)) {
            set.push(obj);
        }
    };

    this.remove = function (obj) {
        set = jQuery.grep(set, function (value) {
            return value !== obj;
        });
    };

    this.clear = function () {
        set = [];
    };

    this.contains = function (obj) {
        return $.inArray(obj, set) > -1;
    };

    this.isEmpty = function () {
        return set.length === 0;
    };
};

메모
다음과 같은 것을 추가할 때$('#myElement')세트에 실제 HTML 요소를 추가해야 합니다.$('#myElement')[0]아... 그리고 만약 당신이 변경된 컨트롤의 목록을 유지하고 싶다면 - 요소의 이름을 사용하세요. (문제가 생겼습니다.):radio제어)를 선택합니다.

노트2
제 생각엔object[key]정수가 더 빠를 수 있습니다.

노트3
숫자나 문자열만 저장할 경우 이 집합이 더 빠릅니다.

var HashSet = function () {

    var set = {};

    this.add = function (key) {
        set[key] = true;
    };

    this.remove = function (key) {
        delete set[key];
    };

    this.clear = function () {
        set = {};
    };

    this.contains = function (key) {
        return set.hasOwnProperty(key);
    };

    this.isEmpty = function () {
        return jQuery.isEmptyObject(set);
    };
};

지도 또는 약한 지도를 반복할 필요가 없는 경우

let m1=new Map();

m1.set('isClosed',false);
m1.set('isInitialized',false);

m1.set('isClosed',true);

m1.forEach(function(v,k)
{
    console.log(`${k}=${v}`);
});

오직 자바스크립트의 맵만이 더 빠른 룩업을 가지고 있습니다. 만약 당신이 룩업만을 원한다면 당신은 아래와 같은 배열로 룩업 맵을 만들고 그것을 사용할 수 있습니다.


function createLookUpMap(arr = []) {
  return new Map(arr.map(item => [item, true]));
}

const lookupMap = createLookUpMap(['apple', 'orange', 'banana']);

lookupMap.has('banana'); // O(1)

언급URL : https://stackoverflow.com/questions/24196067/what-is-the-javascript-equivalent-to-a-c-sharp-hashset

반응형