2016-03-02 20 views
6

Tôi cần một hàm isSubset, khi được cho hai đối tượng so sánh giá trị của nó và cho biết một đối tượng là tập con của một đối tượng khác hay không.Tìm xem đối tượng có tập hợp con của một đối tượng khác trong 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

* "Tôi cần một chức năng" * ... đó không phải là một câu hỏi! StackOverflow không phải là dịch vụ viết mã nơi bạn đặt hàng như từ thực đơn nhà hàng. Hiển thị những gì bạn đã thử. đó là cách nó hoạt động ở đây, sau đó mọi người có thể giúp bạn thông qua các vấn đề – charlietfl

+0

Lặp qua các thuộc tính của 'object2' và kiểm tra xem giá trị bằng (' _.isEqual') với 'object1'. –

+0

Câu hỏi này có thể cho thấy sự thiếu nỗ lực hoặc nghiên cứu, đó là một lý do hoàn toàn tốt để ** xuống ** - bỏ phiếu cho nó. Tuy nhiên, nó không đáp ứng các tiêu chí cho ** đóng ** - bỏ phiếu do tìm kiếm trợ giúp gỡ lỗi nhưng không bao gồm ví dụ tối thiểu, v.v ... vì nó không tìm kiếm trợ giúp gỡ lỗi ngay từ đầu. Các cử tri gần gũi, vui lòng thực hiện phiếu bầu của bạn một cách cẩn thận và phù hợp với các tiêu chí đã nêu. –

Trả lời

1

Trong tiếng Anh:

một số quan trọng trong object2 mà satisifies với điều kiện là có sâu bằng ity giữa giá trị và object1 của nó?

Viết mà ra:

_.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? 
    ); 
    } 
); 

Ở dạng ngắn:

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

Trong ES6:

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

Đề nghị của tôi là đọc qua lodash docs và tìm hiểu tất cả các API, hoặc ít nhất là các API chính. Ví dụ, vấn đề này sẽ rất khó giải quyết một mình nếu bạn không nhận thức được các thói quen quan trọng như _.some_.isEqual. Mặt khác, nếu bạn biết chúng, thì nó khá tầm thường.

+0

Cảm ơn bạn, đây là những gì tôi đang tìm kiếm. – user2412285

+0

Thật không may tôi không thể upvote câu trả lời này là tôi chưa có đủ danh tiếng. – user2412285

+9

Điều này không làm những gì các poster ban đầu nói? Tôi đã thử object1 và object2, nó trả về 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: Bây giờ là chung chung, nhưng nếu muốn nó chung chung hơn bạn sẽ thấy liên kết tiếp theo cho sự so sánh https://stackoverflow.com/a/1144249/5965782

.210
+0

chức năng phải là chung – user2412285

+0

Oh lỗi của tôi, kiểm tra ngay bây giờ. – va2ron1

+0

Không sử dụng so sánh chuỗi để kiểm tra bình đẳng đối tượng. –

5

Bạn có thể thử sử dụng gói isSubset.

Điều này đúng

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

Đây là sai

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

Câu trả lời ở trên sử dụng lodash có giới hạn và không bao gồm tất cả các kịch bản trường hợp cạnh.Tôi chỉ đưa ra giải pháp này phù hợp với tất cả các kịch bản

import _ from 'lodash'; 

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

Trường hợp 1:

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

Trường hợp 2:

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

Trường hợp 3:

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

Trường hợp 4 :

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

Trường hợp 5:

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

Trường hợp 6:

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

trả lời đầu tiên Nima của không thể đúng vì đối với một điều kiện tập hợp con đến mức khó tin, tất cả (không chỉ một số) các phần tử trong bộ "nhỏ hơn" cần được chứa trong bộ "lớn hơn". Phần còn lại về cơ bản là đúng tuy nhiên, chỉ cần thay thế some với every, và trao đổi hai đối tượng (bigsmall):

/** 
 
* 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: Đây là một cách khác để làm việc đó, nhưng đây có thể chậm hơn kể từ khi nó sao chép công cụ và không dừng lại sớm:

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

Có thể thực hiện khá dễ dàng với lodash.

import _ from 'lodash' 

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

Cách sử dụng:

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

isSubset(object1, object2) 
Các vấn đề liên quan