Underscore: __.union은 객체 λ°°μ—΄μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 10μ›” 02일  Β·  32μ½”λ©˜νŠΈ  Β·  좜처: jashkenas/underscore

__.union은 객체 배열을 전달할 λ•Œ 항상 쀑볡을 μƒμ„±ν•©λ‹ˆλ‹€.

예: _.union( [ { a:1 } ], [ { a:1 } ]) λŠ” [ { a:1 }, { a:1 } ] λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ, 밑쀄 자체의 isEqual ν•¨μˆ˜λŠ” ν•΄λ‹Ή 객체가 λ™μΌν•˜λ‹€λŠ” 것을 μ•Œλ €μ€λ‹ˆλ‹€. μ‚¬μš©ν•  평등 비ꡐλ₯Ό μ§€μ‹œν•˜λŠ” ν”Œλž˜κ·Έ/μ˜΅μ…˜μ΄λ‚˜ 비ꡐ기λ₯Ό μ „λ‹¬ν•˜λŠ” μ˜΅μ…˜μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆκΉŒ?

change

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 μŠ€λ ˆλ“œλŠ” _.intersectionWith , _.differenceWith , _.unionWith 및 _.uniqWith λ₯Ό μΆ”κ°€ν•˜μ—¬ λ‚΄ μ½”λ“œμ—μ„œ 비ꡐ μ‚¬μš©μž μ •μ˜λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ μ˜κ°μ„ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

var array = [ { 'a': 1, 'b': 2 }, { 'a': 1, 'b': 3 }, { 'a': 1, 'b': 2 } ];

_.uniqWith(array, _.isEqual);
// => [{ 'a': 1, 'b': 2 }, { 'a': 1, 'b': 3 }]

λͺ¨λ“  32 λŒ“κΈ€

λ‚˜λŠ” 그것이 이미 비ꡐ κΈ°λŠ₯을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것에 λ†€λžμŠ΅λ‹ˆλ‹€. :+1:

이것이 차이, ꡐ차, 고유 λ“±κ³Ό 같은 λ‹€λ₯Έ λͺ¨λ“  λ°°μ—΄ 계산 ν•¨μˆ˜μ— μ μš©λœλ‹€λŠ” 점을 지적할 κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

객체에 λŒ€ν•΄ λ‹€λ₯Έ 동등 비ꡐ기λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ 전체 λ°°μ—΄ ν•¨μˆ˜ μ œν’ˆκ΅°μ„ μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€.

_.union() ν•¨μˆ˜μ— 전달할 수 μžˆλŠ” λΆ€μšΈ λ§€κ°œλ³€μˆ˜ 값을 기반으둜 동등성을 λΉ„κ΅ν•˜λŠ” μ˜΅μ…˜μ΄ μžˆλ‹€λ©΄ 더 쉽지 μ•Šμ„κΉŒμš”? true이면 ν•΄λ‹Ή λ°°μ—΄μ˜ λͺ¨λ“  객체λ₯Ό μžλ™μœΌλ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ _.union([1, 2, 3, 10, [{a:1}, {a:1}]], true) , 좜λ ₯ [1,2,3,10, {a:1}]

@amiral84 μ•„λ‹ˆμš”. 그건 관련이 μ—†μŠ΅λ‹ˆλ‹€. κ·Έ λ™μž‘μ„ μ›ν•˜λ©΄ flatten으둜 union을 κ΅¬μ„±ν•˜μ‹­μ‹œμ˜€.

@michaelficarra 그럼 μ œκ°€ 이 주제의 μš”μ μ„ λ†“μ³€λ‚˜μš”? :NS

@amiral84 그런 것 κ°™μŠ΅λ‹ˆλ‹€. κΈ°λŠ₯ μš”μ²­μ€ 첫 번째 μ˜κ²¬μ— μ™„μ „ν•˜κ³  κ°„κ²°ν•˜κ²Œ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

근본적인 λ¬Έμ œλŠ” _.uniq κ°™μŠ΅λ‹ˆλ‹€. _.union λŠ” κ³ μœ ν•˜κ³  ν‰λ©΄ν™”ν•˜κΈ° μœ„ν•œ 래퍼 ν•¨μˆ˜μΌ λΏμž…λ‹ˆλ‹€.

_.union = restArgs(function(arrays) {
  return _.uniq(flatten(arrays, true, true));
});

이 μŠ€λ ˆλ“œλŠ” _.intersectionWith , _.differenceWith , _.unionWith 및 _.uniqWith λ₯Ό μΆ”κ°€ν•˜μ—¬ λ‚΄ μ½”λ“œμ—μ„œ 비ꡐ μ‚¬μš©μž μ •μ˜λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ μ˜κ°μ„ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

var array = [ { 'a': 1, 'b': 2 }, { 'a': 1, 'b': 3 }, { 'a': 1, 'b': 2 } ];

_.uniqWith(array, _.isEqual);
// => [{ 'a': 1, 'b': 2 }, { 'a': 1, 'b': 3 }]

λ˜λŠ” _.isCollection 라인을 따라 μ»¬λ ‰μ…˜μ„ 닀루고 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λͺ¨μŒμ„ λ‹€λ£¨λŠ” 경우, 비ꡐλ₯Ό μ‚¬μš©ν•΄μ•Ό _.isEqual λŒ€μ‹  === μ»¬λ ‰μ…˜μ˜ κ²½μš°μ— μ’‹μ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€μžˆλ‹€.

@dperrymorrow

μ‚¬μš©ν•΄μ•Ό _.isEqual λŒ€μ‹  === μ»¬λ ‰μ…˜μ˜ κ²½μš°μ— μ’‹μ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€μžˆλ‹€.

동적 μ „ν™˜μ€ λ‚˜μœ μƒκ°μ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€. JSλŠ” λ§Žμ€ 것에 λŒ€ν•΄ === λ˜λŠ” SameValueZero 비ꡐλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λΉ„κ΅μ—μ„œ λ²—μ–΄λ‚  ν•„μš”κ°€ μžˆλŠ” 경우 _.uniqWith 와 같은 것이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

@jdalton 덕뢄에 μ–ΈκΈ‰ν•œ _opWith ν•¨μˆ˜λŠ” λ‚΄κ°€ λ‹¬μ„±ν•˜λ €λŠ” 것에 μ ˆλŒ€μ μœΌλ‘œ μ™„λ²½ν•©λ‹ˆλ‹€. μΆœμ‹œλ₯Ό 톡해 μ–Έμ œ μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ?

@jdalton 비ꡐ에 λŒ€ν•œ 쒋은 μ§€μ μ΄μ§€λ§Œ 일반적으둜 Underscoreκ°€ 개체 κ°„μ˜ 전체 차이λ₯Ό κ°μ§€ν•˜λ„λ‘ ν•˜λŠ” λŒ€μ‹  μ»¬λ ‰μ…˜μ—μ„œ κ³ μœ ν•œ ν‚€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

λ‹€μŒμ€ @wilhen01 의 μš”μ²­μ„ ν•΄κ²°ν•˜μ§€ μ•Šμ„κΉŒμš” _(μ›ν•˜λŠ” 것보닀 더 μž₯ν™©ν•˜κΈ΄ ν•˜μ§€λ§Œ)_

_.chain([{ a: 1 }]).union( [{a: 1}]).unique('a').value();
//=> [{a: 1}]

λ‹€μŒμ€ @wilhen01 의 μš”μ²­μ„ ν•΄κ²°ν•˜μ§€ λͺ»ν•  κ²ƒμž…λ‹ˆλ‹€(μ›ν•˜λŠ” 것보닀 더 μž₯ν™©ν•˜κΈ΄ ν•˜μ§€λ§Œ)

_.uniq 이미 μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ„€, 제 μš”μ μž…λ‹ˆλ‹€. μœ„μ˜ μ½”λ“œλŠ” ν˜„μž¬ κ²Œμ‹œλœ λŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.
κ²°ν•© 결과에 λŒ€ν•œ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ uniq/uniqueλ₯Ό ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆκΉŒ?

@dperrymorrow κ·Έ μ˜ˆμ—μ„œ 쑰금 λ²—μ–΄λ‚˜μ„œ λ‹€λ₯Έ 속성을 μΆ”κ°€ν•˜μ‹­μ‹œμ˜€ .

μ•Œμ•˜μ–΄, μ•Œμ•˜μ–΄, λ―Έμ•ˆ... λ‚œ ν˜Έμ „μ μ΄μ§€ μ•Šκ³  κ·Έλƒ₯ 문제λ₯Ό μ™„μ „νžˆ μ΄ν•΄ν•˜κ³  μ‹Άμ—ˆμ–΄. _.uniqWith ν•¨μˆ˜μ— λŒ€ν•œ pull μš”μ²­μ„ μ œμΆœν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ±±μ •λ§ˆμ„Έμš”.

_.intersectionWith, _.differenceWith, _.unionWith 및 _.uniqWith

4개의 μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” λŒ€μ‹  비ꡐ ν•¨μˆ˜λ₯Ό μ΅œμ’… 인수둜 μ„ νƒμ μœΌλ‘œ 전달할 수 μžˆλ„λ‘ ν•˜λŠ” 것이 APIκ°€ 더 쒋지 μ•Šμ„κΉŒμš”?

@jashkenas

4개의 μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” λŒ€μ‹  비ꡐ ν•¨μˆ˜λ₯Ό μ΅œμ’… 인수둜 μ„ νƒμ μœΌλ‘œ 전달할 수 μžˆλ„λ‘ ν•˜λŠ” 것이 APIκ°€ 더 쒋지 μ•Šμ„κΉŒμš”?

예, ν•  수 μžˆμ§€λ§Œ _.uniq 와 같은 λ©”μ„œλ“œλŠ” 이미 iteratee 전달을 μ§€μ›ν•˜κ³  λ°”μ΄λ„ˆλ¦¬/μ •λ ¬λœ 검색 ν”Œλž˜κ·Έ 및 μ»¨ν…μŠ€νŠΈ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•œ μ§€μ›μœΌλ‘œ κ³ΌλΆ€ν•˜κ°€ 많이 걸리기 λ•Œλ¬Έμ— λ³΅μž‘ν•©λ‹ˆλ‹€. 이것은 이 상황에 λ„ˆλ¬΄ μ˜λ¦¬ν•˜κ²Œ λŠκ»΄μ§€λŠ” arity μŠ€λ‹ˆν•‘μ„ λ„μž…ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이것은 λ˜ν•œ κ΅¬ν˜„μ„ λ‹¨μˆœν™”ν•˜κ³  λ³„λ„μ˜ λ°©λ²•μœΌλ‘œ λΆ„ν• ν•  수 μžˆλŠ” 단일 지점에 λ§Žμ€ 선택적 κΈ°λŠ₯을 λ²ˆλ“€λ‘œ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— ν–₯ν›„ λͺ¨λ“ˆν™” λ…Έλ ₯을 λ³΅μž‘ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

λ§žμŠ΅λ‹ˆλ‹€. μ™„μ „νžˆ λΆˆν–‰ν•œ λ””μžμΈ λ¬Έμ œμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 비ꡐ기λ₯Ό ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ κΈ°λŠ₯을 λ§Œλ“œλŠ” 것도 μ˜¬λ°”λ₯Έ μ†”λ£¨μ…˜μ²˜λŸΌ λŠκ»΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

자, 그럼 μΆ”κ°€ 비ꡐ ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜κ°€ μ—¬κΈ°λ‘œ κ°€λŠ” κΈΈμž…λ‹ˆκΉŒ?
κ·Έλ ‡λ‹€λ©΄ λ‚΄ pull μš”μ²­μ„ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ˜ˆμƒν•˜λŠ” μœ μΌν•œ κΉŒλ‹€λ‘œμš΄ 뢀뢄은 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ @jdalton 처럼 λ§€κ°œλ³€μˆ˜ ꡬ문 뢄석을 μ’€ 더 털이 λ§Žμ€ κ²ƒμœΌλ‘œ

_.uniq = _.unique = function(array, isSorted, iteratee, context) {
  if (!_.isBoolean(isSorted)) {
    context = iteratee;
    iteratee = isSorted;
    isSorted = false;
  }
//...

μ•„λ§ˆλ„ isSorted _.isFunction 인지 ν™•μΈν•˜κΈ° μœ„ν•΄ μΆ”κ°€ 검사λ₯Ό μΆ”κ°€ν•œ λ‹€μŒ 이λ₯Ό λΉ„κ΅κΈ°λ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@jashkenas

κ·ΈλŸ¬λ‚˜ 비ꡐ기λ₯Ό ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ κΈ°λŠ₯을 λ§Œλ“œλŠ” 것도 μ˜¬λ°”λ₯Έ μ†”λ£¨μ…˜μ²˜λŸΌ λŠκ»΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

그것은 λ‚˜μœ 상황에 λŒ€ν•œ μ΅œμ„ μ˜ 선택이 될 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ΅œκ·Όμ— κ³ΌλΆ€ν•˜λœ κΈ°λŠ₯을 λΆ„λ¦¬ν•˜κΈ° μ‹œμž‘ν–ˆκ³  κ·Έ 결과에 κ½€ λ§Œμ‘±ν–ˆμŠ΅λ‹ˆλ‹€. API ν‘œλ©΄μ„ μ¦κ°€μ‹œν‚€μ§€λ§Œ maxBy , uniqBy , pickBy λ˜λŠ” uniqWith , unionWith 와 같은 μœ μ‚¬ν•œ 주제의 λ©”μ„œλ“œλ₯Ό 더 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•˜κ³  κ·Έλ£Ήν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ uniqBy unionWith , zipWith λ˜λŠ” sortedIndexBy , sortedIndexOf , sortedUniq . uniq 경우 ν˜„μž¬ 곡유 기반 κΈ°λŠ₯을 μ—¬μ „νžˆ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

이 pull request #2368을 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

μ €λŠ” :+1: uniqBy λ˜λŠ” uniqWith μž…λ‹ˆλ‹€. λ‚˜λŠ” uniq μΆ”κ°€λ‘œ μ˜€λ²„λ‘œλ”©ν•˜λŠ” 것에 λŒ€ν•΄ μ™„μ „νžˆ λ°˜λŒ€ν•  κ²ƒμž…λ‹ˆλ‹€(ν˜„μž¬ #2368이 μ œμ•ˆλ¨)

:+1: @megawac , uniqBy .

Fwiw lodashλŠ” uniqBy λ₯Ό _.uniq(array, iteratee) 의 λΆ„ν•  ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜κ³  _.uniqWith λ₯Ό 비ꡐ기 μ‚¬μš©μž 지정을 ν—ˆμš©ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

예, 생각해보면 uniqWith κ°€ 더 λ‚˜μ€ μ΄λ¦„μž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ λ³„λ„μ˜ λ°©λ²•μœΌλ‘œ Lodashμ—μ„œ μš”μ²­μ„ 가져와야 ν•©λ‹ˆκΉŒ?
두 ν”„λ‘œμ νŠΈκ°€ 합쳐진 쀄 μ•Œμ•˜λŠ”λ° μ°©κ°μΈκ°€μš”?

@dperrymorrow

그런 λ‹€μŒ λ³„λ„μ˜ λ°©λ²•μœΌλ‘œ Lodashμ—μ„œ μš”μ²­μ„ κ°€μ Έμ™€μ•Όν•©λ‹ˆκΉŒ?

ν•„μš” μ—†μŠ΅λ‹ˆλ‹€. 이미 lodash의 edge master λΈŒλžœμΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

두 ν”„λ‘œμ νŠΈκ°€ 합쳐진 쀄 μ•Œμ•˜λŠ”λ° μ°©κ°μΈκ°€μš”?

아직. Lodash v4λŠ” λ³‘ν•©μ˜ 아이디어 쀑 일뢀λ₯Ό 증λͺ…ν•©λ‹ˆλ‹€.

@jdalton λ‹€λ₯Έ λ°˜λ³΅μžμ™€ ν•¨κ»˜ _.uniqWith κ΅¬ν˜„μ— λŒ€ν•΄ μ’€ 더 μžμ„Ένžˆ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@νŒŒλΈŒλ‹ˆ
ν™•μ‹ ν•˜λŠ”. lodash/npm/_baseUniq λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
comparator κ°€ μ „λ‹¬λ˜λ©΄ arrayIncludes (Underscore의 contains ) λŒ€μ‹  arrayIncludesWith λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

@jdalton 도움이 λ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰