Mam następujący przedmiot zagnieżdżonego

const ERR_CODES = {
    INVALID_CONSUMER_ID: {
        code: 1000,
        message: 'Invalid Consumer ID',
    },
    INVALID_MOBILE: {
        code: 1001,
        message: 'Invalid Mobile Number',
    },
    INVALID_ZIPCODE: {
        code: 1002,
        message: 'Invalid Zipcode',
    },
    INVALID_FIRST_NAME: {
        code: 1000,
        message: 'First Name',
    },
}

Chcę rzucić błąd, gdy dwa obiekty mają ten sam kod, jak w przykładzie identyfikator konsumencki i imieniu mają 1000 dla kodeksów błędów. Jaki jest najszybszy sposób przejścia przez mój ERR_CODES obj i zobacz, czy każdy kod powtarza?

0
Haroun Ansari 1 czerwiec 2018, 22:22

6 odpowiedzi

Najlepsza odpowiedź

Możesz użyć mapy, aby śledzić kody i porównać z nim, jeśli kod jest już częścią mapy, możesz rzucić błąd.

const ERR_CODES = {
  INVALID_CONSUMER_ID: {
    code: 1000,
    message: 'Invalid Consumer ID',
  },
  INVALID_MOBILE: {
    code: 1001,
    message: 'Invalid Mobile Number',
  },
  INVALID_ZIPCODE: {
    code: 1002,
    message: 'Invalid Zipcode',
  },
  INVALID_FIRST_NAME: {
    code: 1000,
    message: 'First Name',
  }
};

let keys = Object.keys(ERR_CODES);
let codesMap = {};

for (let i = 0; i < keys.length; i++) {
  let key = keys[i];
  let obj = ERR_CODES[key];
  let code = obj.code;

  if (!codesMap[code]) {
    codesMap[code] = true
  } else {
    console.error('Duplicate');
  }
}
3
Sushanth -- 1 czerwiec 2018, 19:31

Utwórz tablicę wszystkich obecnych kodów, a następnie zdobądź wszystkie unikalne kody. Jeśli są równości długości, nie ma powtórzeń. Jeśli unikalna tablica kodów jest krótsza, jest powtarzanie.

const ERR_CODES = {
    INVALID_CONSUMER_ID: {
        code: 1000,
        message: 'Invalid Consumer ID',
    },
    INVALID_MOBILE: {
        code: 1001,
        message: 'Invalid Mobile Number',
    },
    INVALID_ZIPCODE: {
        code: 1002,
        message: 'Invalid Zipcode',
    },
    INVALID_FIRST_NAME: {
        code: 1000,
        message: 'First Name',
    },
};

const codes = Object.keys(ERR_CODES).map(err => ERR_CODES[err].code)

const uniq_codes = codes.reduce((p, c) => {
    if (p.indexOf(c) < 0) p.push(c);
    return p;
}, []);

console.log(codes.length == uniq_codes.length);
2
larz 1 czerwiec 2018, 19:29

Ponieważ musisz sprawdzić tylko, czy każdy kod jest powtarzany, wybrałbym Set, aby zapisać wszystkie swoje kody:

let codes_num = Object.keys(ERR_CODES).map(elem => {
    return ERR_CODES[elem].code;
});

let codes = new Set(codes_num);

Dzięki właściwościom Set zduplikowane elementy są po prostu odrzucane. Z tego powodu prosta sprawdza jak ta:

Object.keys(ERR_CODES).length == codes.size

Powie ci, czy znaleziono duplikowany kod.

1
Marco Luzzara 1 czerwiec 2018, 19:44

Może nie być najszybszym sposobem, ale sposób na to

const ERR_CODES = {
    INVALID_CONSUMER_ID: {
        code: 1000,
        message: 'Invalid Consumer ID',
    },
    INVALID_MOBILE: {
        code: 1001,
        message: 'Invalid Mobile Number',
    },
    INVALID_ZIPCODE: {
        code: 1002,
        message: 'Invalid Zipcode',
    },
    INVALID_FIRST_NAME: {
        code: 1000,
        message: 'First Name',
    },
};

function isValid(data) {
    try{
    Object.keys(data).reduce((obj, key) => {
       if (data[key].code in obj) {
          throw new Error(`Duplicate code: ${data[key].code}`);
       } else {
          obj[data[key].code] = 'found';
       }
       return obj;
    }, {});
    } catch(e) {
       console.log(e.message);
       return false;
    }
    return true;
}

console.log(isValid(ERR_CODES));
0
Zohaib Ijaz 1 czerwiec 2018, 19:33

Wezmę Filtr podejście sprawdzić, czy klucz istnieje więcej niż jeden raz.

Za pomocą filtra możemy uzyskać listę duplikatów elementów za pomocą 2 filtrów i sprawdzanie rozmiaru zwracanej tablicy. Jeśli długość jest większa niż 1, oznacza to, że znaleźliśmy duplikaty.

const ERR_CODES = {
  INVALID_CONSUMER_ID: {
    code: 1000,
    message: 'Invalid Consumer ID',
  },
  INVALID_MOBILE: {
    code: 1001,
    message: 'Invalid Mobile Number',
  },
  INVALID_ZIPCODE: {
    code: 1002,
    message: 'Invalid Zipcode',
  },
  INVALID_FIRST_NAME: {
    code: 1000,
    message: 'First Name',
  },
}

let codes = Object.values(ERR_CODES)

let result = codes.filter(item => codes.filter(i => i.code == item.code).length > 1)

console.log(result)

if(result.length > 0) {
  // We have duplicates throw error here
  console.error('Duplicate codes')
}
0
Get Off My Lawn 1 czerwiec 2018, 19:56

Moje wziąć pod uwagę najszybsze rozwiązanie, które przetorzymy się ERR_CODES tylko raz i przerwać po znalezieniu duplikatu:

const codes = new Set();

for (err in ERR_CODES) { 
  const {code} = ERR_CODES[err]; 
  if (codes.has(code)) { 
    console.error(`Duplicate code: ${code}`); 
    break; 
  } 
  codes.add(code); 
}
0
ic3b3rg 1 czerwiec 2018, 22:38