programing

lodash를 사용하여 들쭉날쭉한 배열 비교(주문 없이 품목 존재)

cafebook 2023. 10. 30. 21:15
반응형

lodash를 사용하여 들쭉날쭉한 배열 비교(주문 없이 품목 존재)

루프를 사용해서 할 수 있다는 것을 알고 있지만, 이를 위한 우아한 방법을 찾고 있습니다.

두 개의 들쭉날쭉한 어레이(어레이)가 있습니다.

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

사용하고싶습니다lodash두 개의 들쭉날쭉한 배열이 동일한지 확인합니다.'동일'이란 것은 안에 아이템이 없다는 뜻입니다.array1에 들어 있지 않은array2. 들쭉날쭉한 배열의 항목은 실제로 배열입니다.그래서 내부 배열을 비교해 보겠습니다.

이 항목들 간의 동일성을 확인한다는 측면에서:

['a', 'b'] == ['b', 'a'] 

아니면

['a', 'b'] == ['a', 'b'] 

글자가 항상 순서대로 되어 있기 때문에 둘 다 작동합니다.


업데이트: 원래 질문은 "어레이"에 대해 이야기하는 것이었고, 몇 년 동안 많은 사람들이 간단한 1차원 어레이를 비교하는 것에 대해 토론(답변 추가)했습니다(질문에 제시된 예가 예상했던 단순한 1차원 어레이와 실제로 유사하지 않다는 것을 깨닫지 못한 채).).

외부 배열을 정렬하는 경우 내부 배열이 이미 정렬되어 있으므로 사용할 수 있습니다.

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true

참고:.sort()배열을 변형시킬 겁니다문제가 있는 경우 먼저 다음을 사용하여 복사본을 만듭니다(예:)..slice()또는 스프레드 연산자(...).

아니면 아래 댓글에서 Daniel Budick이 추천하는 대로 하세요.

_.isEqual(_.sortBy(array1), _.sortBy(array2))

로다시스sortBy()배열을 변형시키지 않습니다.

로대시를 사용할 수 있습니다.xor이 일로

doArraysContainSameElements = _.xor(arr1, arr2).length === 0

배열 [1, 1]을 배열 [1]과 다른 것으로 간주하면 다음과 같이 성능을 약간 향상시킬 수 있습니다.

doArraysContainSameElements = arr1.length === arr2.length && _.xor(arr1, arr2).length === 0

여기에 이미 답이 있지만, 이것이 저의 순수한 JS 구현입니다.최적인지는 잘 모르겠지만, 투명하고 읽기 쉽고 간단합니다.

// Does array a contain elements of array b?
const union = new Set([...a, ...b]);
const contains = (a, b) => union.size === a.length && union.size === b.length;
// Since order is not important, just data validity.
const isEqualSet = (a, b) => union.contains(a, b) || union.contains(b, a)

의 이론적 근거는contains()만약에a의 모든 요소를 포함하고 있습니다.b, 그러면 같은 세트에 넣어도 크기가 변하지 않습니다.

예를 들어, 만약const a = [1,2,3,4]그리고.const b = [1,2],그리고나서new Set([...a, ...b]) === {1,2,3,4}. 보다시피, 결과 집합은 다음과 같은 요소를 갖습니다.a.

거기서부터 좀 더 간결하게 설명하자면, 우리는 다음과 같이 요약할 수 있습니다.

const isEqualSet = (a: string[], b: sting[]): boolean => {
  const union = new Set([...a, ...b])
  return union.size === a.length && union.size === b.length;
}

편집: obj[{a:true}, true, 3]에서는 작동하지 않지만 원시 요소인 경우 배열 내용을 비교합니다.서로 다른 순서로 동일한 값을 사용하여 문자열 두 개의 배열에 대해 고정 및 테스트하는 방법.개체 유형에서는 작동하지 않습니다.비교가 필요한 종류에 따라 도우미 기능을 호출하는 범용 도우미를 만드는 것을 추천합니다. 시도해 보세요._.isEqual(a. b);아주 환상적인 로다시 도서관에서 말입니다

동일하다는 뜻은 array1에 array2에 포함되지 않은 아이템이 없다는 뜻입니다.

평면()과 차분()을 사용할 수 있는데, 이는 물건이 있어도 상관없이 잘 작동합니다.array2없는array1. array1이 array2의 서브셋인지 묻는 것처럼 들립니다.

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

function isSubset(source, target) {
    return !_.difference(_.flatten(source), _.flatten(target)).length;
}

isSubset(array1, array2); // → true
array1.push('d');
isSubset(array1, array2); // → false
isSubset(array2, array1); // → true

PURE JS(배열과 하위배열이 임의의 순서로 2개 이상의 요소를 가질 때도 작동함).문자열이 포함된 경우,용으로 join('-')문자열에 사용되지 않는 parametr 문자(utf 가능)

array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join()

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['b', 'a']];

var r = array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join();

console.log(r);

이 해결책을 게시한 것에 대해 매우 부정한 느낌이 들지만:

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isMatch([array1], [array2]) && _.isMatch([array2], [array1]) // true

array1 = [['b', 'a'], ['c', 'b']];
array2 = [['b', 'c'], ['a', 'b']];
_.isMatch([array1], [array2]) && _.isMatch([array2], [array1]) // also true

참고로 포장을 해야 합니다.array1그리고.array2이것이 작동하기 위해서 컨테이너(배열, 물체)에? 왜?아마 여기에 아주 어리석은 이유가 있을 겁니다.

import { differenceBy } from 'lodash'

export default function (arr1, arr2) {
    return !differenceBy(arr1, arr2).length && arr1.length === arr2.length
}

서로 다른 문자가 없고 배열 길이가 동일한 경우 동일하게 만듭니다.

편집: 이 질문의 다차원적인 면을 놓쳤기 때문에, 사람들이 1차원 배열을 비교하는 데 도움이 될까 봐 여기에 둡니다.

오래된 질문이지만 사용 속도에 문제가 있었습니다..sort()아니면sortBy(), 그래서 대신 이걸 사용했습니다.

function arraysContainSameStrings(array1: string[], array2: string[]): boolean {
  return (
    array1.length === array2.length &&
    array1.every((str) => array2.includes(str)) &&
    array2.every((str) => array1.includes(str))
  )
}

그것은 빨리 실패하는 것을 의도했고, 나의 목적을 위해서는 잘 작동합니다.

사용할 수 있습니다._.difference차이가 있는지 여부를 확인하는 기능입니다.

function isSame(arrayOne, arrayTwo) {
   var a = _.uniq(arrayOne),
   b = _.uniq(arrayTwo);
   return a.length === b.length && 
          _.isEmpty(_.difference(b.sort(), a.sort()));
}

// examples
console.log(isSame([1, 2, 3], [1, 2, 3])); // true
console.log(isSame([1, 2, 4], [1, 2, 3])); // false
console.log(isSame([1, 2], [2, 3, 1])); // false
console.log(isSame([2, 3, 1], [1, 2])); // false

// Test cases pointed by Mariano Desanze, Thanks.
console.log(isSame([1, 2, 3], [1, 2, 2])); // false
console.log(isSame([1, 2, 2], [1, 2, 2])); // true
console.log(isSame([1, 2, 2], [1, 2, 3])); // false

이것이 당신에게 도움이 되기를 바랍니다.

StackBlitz에서 예제 링크 추가

언급URL : https://stackoverflow.com/questions/29951293/using-lodash-to-compare-jagged-arrays-items-existence-without-order

반응형