Analyst
Analyst

Reputation: 117

Compare array of object with an array

I have a request

const request=additionalFields: [
    { field: 'PHONE', required: true },  
    { field: 'COMPANY', required: true },
    { field: 'MOBILE', required: true }, 
    { field: 'COUNTRY', required: true } 
  ]

the response i am getting is this

"additionalFields":
{
    'PHONE':true,
    'COMPANY':true,
    'MOBILE':true,
    'COUNTRY':true
}

i am not sure how to compare them. i kind of wrote something but even to me it looks wrong

const fields = request["additionalFields"];
    
    for (let i = 0, len = fields.length; i < len; i++) {
      expect(request.additionalFields[i].required).to.eql(
        response.additionalFields
      );

Upvotes: 0

Views: 77

Answers (5)

Tushar Choudhari
Tushar Choudhari

Reputation: 21

You can use the for...of syntax to do this.

Here's the documentation.

const request = {
  additionalFields: [
    { field: 'PHONE', required: true },  
    { field: 'COMPANY', required: true },
    { field: 'MOBILE', required: true }, 
    { field: 'COUNTRY', required: true } 
  ]
};

const response = {
  additionalFields: {
    PHONE:true,
    COMPANY:true,
    MOBILE: true,
    COUNTRY:true
  }
}

const requestFields = request['additionalFields'];
const responseFields = response['additionalFields'];

for(const { required, field } of requestFields) {
    expect(required).to.eql(responseFields[field]);
}

Upvotes: 0

Devesh
Devesh

Reputation: 613

You should loop over each field detail in the request and compare the value against the response. Here you go:

const request = {
    additionalFields: [
        { field: 'PHONE', required: true },
        { field: 'COMPANY', required: true },
        { field: 'MOBILE', required: true },
        { field: 'COUNTRY', required: true },
    ],
};

const response = {
    additionalFields: {
        PHONE: true,
        COMPANY: true,
        MOBILE: true,
        COUNTRY: true,
    },
};

for (let f of request.additionalFields) {
    // Observe f is like { field:'PHONE', required: true }
   // Next two lines are just for test, please remove and uncomment last one in your use case.
    const comparisonResult = f.required === response.additionalFields[f.field];
    console.log(`for field ${f.field}, It's ${comparisonResult}`);
    // expect(f.required).to.eql(response.additionalFields[f.field]);
}

You can further improve readability by using destructuring, drop a comment if you want to see that.

Upvotes: 0

Kinglish
Kinglish

Reputation: 23654

Here's another way. Just filter out anything that doesn't match up, then you'll have an array of differences if there are any.

const request={
additionalFields: [
    { field: 'PHONE', required: true },  
    { field: 'COMPANY', required: true },
    { field: 'MOBILE', required: true }, 
    { field: 'COUNTRY', required: true } 
  ]
 }

const incoming = {
  "additionalFields": {
    'PHONE': true,
    'COMPANY': true,
    'MOBILE': false,
    'COUNTRY': true
  }
}

let differences = request.additionalFields.filter(f => incoming.additionalFields[f.field] !== f.required)
console.log(differences)

Upvotes: 1

anqit
anqit

Reputation: 1090

You need to dereference the response.additionalFields object using the value of field from each entry in request.additionalFields. Something like

for(const { field, required } of request.additionalFields) {
    expect(required).to.eql(
        response.additionalFields[field]
      );
}

Upvotes: 0

Saurabh Yadav
Saurabh Yadav

Reputation: 3386

    const request = [
        { field: 'PHONE', required: true },  
        { field: 'COMPANY', required: true },
        { field: 'MOBILE', required: true }, 
        { field: 'COUNTRY', required: true } 
      ]

    const response = {"additionalFields":
    {
        'PHONE':true,
        'COMPANY':true,
        'MOBILE':true,
        'COUNTRY':true
    }}
    
    for (const [key, value] of Object.entries(response['additionalFields'])) {
       const {required, field} = request.find(({field}) => key === field);
        if(required === value) {  // here you can compare
            console.log(key, field, value);  
        }
    }

Upvotes: 0

Related Questions