2016-03-02 9 views
6

Potrzebuję funkcji isSubset, która po podaniu dwóch obiektów porównuje jej wartości i informuje, czy jeden obiekt jest podzbiorem innego.Znajdź, czy obiekt jest podzbiorem innego obiektu w javascript

object1 = { pickUpLocation : {city : 'Hyderabad', state: 'Telangana' }}; 
object2 = { dist : 322, pickUpLocation: {city : 'Hyderabad', state: 'Telangana' }}; 
isSubset(object1, object2); //should return true 
object3 = { pickUpLocation : {city : 'Chennai', state: 'Telangana' }} 
object4 = { dist : 322, pickUpLocation: {city : 'Hyderabad', state: 'Telangana' }} 
isSubset(object3, object4) //should return false as city's value is different 
+3

* "Potrzebuję funkcję" * ... to nie jest pytanie! StackOverflow nie jest usługą pisania kodu, w której umieszczasz zamówienia, np. Z menu restauracji. Pokaż, co próbujesz. tak to działa tutaj, wtedy ludzie mogą pomóc ci przez problemy. – charlietfl

+0

Przeprowadź pętlę we właściwościach 'object2' i sprawdź, czy wartość jest równa (' _.isEqual') do 'object1'. –

+0

To pytanie może wskazywać na brak wysiłku lub badań, co jest doskonałym powodem do ** obniżenia ** - zagłosuj. Jednak nie spełnia kryteriów ** zamknięcia ** - głosowania z powodu szukania błędów w debugowaniu, ale nie uwzględnia minimalnego przykładu itp., Ponieważ nie szuka po prostu debugowania pomocy. Bliscy wyborcy głosujcie uważnie i zgodnie z określonymi kryteriami. –

Odpowiedz

1

W języku angielskim:

Czy istnieje niektóre klucz w object2 który satisifies warunek, że istnieje głęboka równa ity pomiędzy jej wartością i object1?

Napisz, że spośród:

_.some(      // Is there some key 
    object2,     // in object2 
    function(val, key) {    // which satisfies the condition that 
    return _.isEqual(  // there is deep equality between 
     val,     // its value and 
     object1[key]     // object1? 
    ); 
    } 
); 

W krótszej formie:

_.some(object2, function(val, key) { return _.isEqual(val, object1[key]); }) 

W ES6:

_.some(object2, (val, key) => _.isEqual(val, object1[key])) 

Moja propozycja jest taka, aby zapoznać się z lodash docs i dowiedzieć się wszystkiego API, a przynajmniej te główne. Na przykład ten problem będzie bardzo trudny do rozwiązania na własną rękę, jeśli nie wiesz o ważnych procedurach, takich jak _.some i _.isEqual. Z drugiej strony, jeśli je znasz, to całkiem banalnie.

+0

Dziękuję, tego właśnie szukałem. – user2412285

+0

Niestety nie mogłem zgodzić się z tą odpowiedzią, ponieważ nie mam jeszcze wystarczającej reputacji. – user2412285

+9

To nie robi tego, co oryginalny plakat mówi? Próbowałem object1 i object2, zwraca false. – huggie

0
function isSubset(obj1, obj2) { 
    for (var key in obj2){ 
    if (JSON.stringify(obj2[key]) === JSON.stringify(obj1[key])) 
     return true; 
    } 
    return false; 
} 

Edit: Teraz jest nazwą rodzajową, ale jeśli chcesz to bardziej ogólny powinien pojawić się odnośnik naśladowania dla porównania https://stackoverflow.com/a/1144249/5965782

+0

funkcja powinna być ogólna – user2412285

+0

O mój błąd, sprawdź teraz. – va2ron1

+0

Nie używaj porównywania ciągów do sprawdzania równości obiektów. –

5

Możesz spróbować użyć pakietu isSubset.

To prawda

isSubset(
    { dist : 322, pickUpLocation: {city : 'Hyderabad', state: 'Telangana' }}, 
    { pickUpLocation : {city : 'Hyderabad', state: 'Telangana' }} 
); 

To jest fałszywy

isSubset(
    { dist : 322, pickUpLocation: {city : 'Hyderabad', state: 'Telangana' }}, 
    { pickUpLocation : {city : 'Chennai', state: 'Telangana' }} 
); 
0

Powyższa odpowiedź za pomocą lodash ma ograniczenia i nie obejmuje wszystkich możliwych scenariuszy krawędź.Ja po prostu wymyślił tego rozwiązania, które pasuje do wszystkich scenariuszy

import _ from 'lodash'; 

isSubset(obj1, obj2) { 
    let matched = true; 
    _.forEach(obj1, (value, key) => { 
    if(!requirements || !_.isEqual(value, obj2[key])) { 
     matched = false; 
     return; 
    } 
    }); 
    return matched; 
} 

Przypadek 1:

const obj1 = { foo: 'bar' }; 
const obj2 = { foo: 'bar', baz: 'qux' }; 
console.log(isSubset(obj1, obj2)); // true 

Przypadek 2:

const obj1 = { foo: 'bar' }; 
const obj2 = { foo: 'bar' }; 
console.log(isSubset(obj1, obj2)); // true 

Przypadek 3:

const obj1 = { foo: 'bar', baz: 'qux' }; 
const obj2 = { foo: 'bar'}; 
console.log(isSubset(obj1, obj2)); // false 

Przypadek 4 :

const obj1 = undefiend; 
const obj2 = undefiend; 
console.log(isSubset(obj1, obj2)); // true 

Przypadek 5:

const obj1 = undefiend; 
const obj2 = { foo: 'bar'}; 
console.log(isSubset(obj1, obj2)); // true 

Przypadek 6:

const obj1 = { foo: 'bar'}; 
const obj2 = undefiend; 
console.log(isSubset(obj1, obj2)); // false 
0

pierwsza odpowiedź Nima nie może być prawda, ponieważ na stan podzbiór aby mogło być prawdziwe, wszystko (nie tylko niektóre) elementy w "mniejszym" zestawie muszą być zawarte w "większym" zestawie. Reszta jest w zasadzie poprawna, choć, po prostu zastąpić some z every i zamienić dwa obiekty (big i small):

/** 
 
* Determine whether "small" is a subset of "big" 
 
* @see https://stackoverflow.com/questions/35737312/find-if-an-object-is-subset-of-another-object-in-javascript/48971177#48971177 
 
*/ 
 
function isSubset(big, small) { 
 
    const { every, isEqual } = _; 
 
    return every(small, 
 
    (v, k) => isEqual(v, big[k]) 
 
); 
 
} 
 

 
// test it! 
 
var object1 = { pickUpLocation : {city : 'Hyderabad', state: 'Telangana' }}; 
 
var object2 = { dist : 322, pickUpLocation: {city : 'Hyderabad', state: 'Telangana' }}; 
 
var a = {i:1, j:2, k:3}; var b = {i:1, j:2}; var c = {i:2, j:2}; 
 

 
console.log([ 
 
    isSubset(a, b), 
 
    isSubset(a, c), 
 
    isSubset(b, a), 
 
    isSubset(object1, object2), 
 
    isSubset(object2, object1) 
 
]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

PS: Oto kolejny sposób to zrobić, ale to chyba wolniej, ponieważ kopiuje rzeczy i nie zatrzymuje się wcześnie:

function isSubset(big, small) { 
    const { pick, isEqual } = _; 
    return isEqual(pick(big, Object.keys(small)), small); 
} 
0

Można to zrobić całkiem łatwo z lodash.

import _ from 'lodash' 

const isSubset = (object1, object2) => (
    _.every(object1, (val, key) => _.isEqual(val, object2[key])) 
) 

Zastosowanie:

const object1 = { pickUpLocation: { city: 'Hyderabad', state: 'Telangana' }}; 
const object2 = { dist: 322, pickUpLocation: { city: 'Hyderabad', state: 'Telangana' }}; 

isSubset(object1, object2)