জাভাস্ক্রিপ্ট অ্যারে পুনরায় গঠন


16

আমি ছাত্র এবং অভিভাবক ঠিকানা সঙ্গে একটি অ্যারে আছে।

উদাহরণ স্বরূপ,

  const users = [{
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'USA',
    relationship:'mother'
  },
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'Spain',
    relationship:'father'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent_address: 'France',
    relationship:'father'
  }
];

আমি নিম্নলিখিত ফলাফলটিতে এটি পুনরায় ফর্ম্যাট করার চেষ্টা করছি।

const list = [
{
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent: [
        {
            parent_address: 'USA',
            relationship:'mother'
        },{
            parent_address: 'Spain',
            relationship:'father'
        }
    ]
},
{
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent:[
        {
            parent_address: 'France',
            relationship:'father'
        }
    ]
}
];

এখনও পর্যন্ত আমি নিম্নলিখিত উপায় চেষ্টা করেছিলাম। আমি নিশ্চিত না যে এটি সঠিক উপায় বা না।

const duplicateInfo = [];
for (var i = 0; i < user[0].length; i++) {
    var parent = [];
    if (duplicateInfo.indexOf(user[0][i].id) != -1) {
        // Do duplicate stuff
    } else {
        // Do other
    }
    duplicateInfo.push(user[0][i].id);
}

1
সংক্ষেপে - ভবিষ্যতের পাঠকদের পক্ষে এটি আরও সহজ করার জন্য - আপনি কোনও বস্তুকে একত্রিত করতে এবং যুক্ত করতে চান parent_addressএবং কোনও সদৃশ নাম এবং ইমেল ঠিকানা পাওয়া গেলে এগুলি মার্জ করুন। relationshipparent
লুইস

2
পিতামাতার ঠিকানা কীভাবে নেওয়া যেতে পারে? এগুলি সম্পর্কিত কী সম্পত্তি ব্যবহার করা উচিত? অগ্রিম ধন্যবাদ! :)
স্টেপআপ

শেষে কোড স্নিপেট ডেটা কাঠামোর সাথে মেলে না। আপনি বলতে const list = []প্রথমে কিন্তু নীচে আপনি বলছি যে তালিকা ধরে এ দৃশ্যত দ্বারা উপর iterating user[0]। আপনার উদাহরণ কোডটি সামঞ্জস্যপূর্ণ হওয়া উচিত।
TKoL

@ লুইস হ্যাঁ, আপনি ঠিক যেমনটি উল্লেখ করেছেন ঠিক তেমনই আমি চাই।
ক্যাথি

@ স্টেপ, সেগুলি মানটি আমার বিদ্যমান ডিবি থেকে এটি পুনরুদ্ধার করে এবং ছাত্র এবং অভিভাবক সারণীর সাথে যোগ দেয়। আমার কেবল পিতামাতার টেবিলে শিক্ষার্থীর আইডি রয়েছে।
ক্যাথি

উত্তর:


12

একটি পদ্ধতির হ'ল .reduce()একটি অবজেক্ট হিসাবে একটি সংযোজক হিসাবে ব্যবহার করা। প্রতিটি আইডির জন্য, আপনি কোনও পিতামাতার অ্যারের সাথে সম্পর্কিত কোনও বস্তু সংরক্ষণ করতে পারেন যা আপনি যখনই একই .reduce()আইডিতে কোনও নতুন অবজেক্টের মুখোমুখি হন তখন আপনি নিজের কলব্যাকে যুক্ত করতে পারেন । তারপরে আপনার অবজেক্ট থেকে কোনও অ্যারের পেতে, আপনি Object.values()এটিতে কল করতে পারেন

নীচে উদাহরণ দেখুন:

const users = [{ id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'USA', relationship: 'mother' }, { id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'Spain', relationship: 'father' }, { id: 2, name: 'Mark', email: 'mark@mail.com', age: 28, parent_address: 'France', relationship: 'father' } ];
const res = Object.values(users.reduce((acc, {parent_address, relationship, ...r}) => { // use destructuring assignment to pull out necessary values
  acc[r.id] = acc[r.id] || {...r, parents: []}
  acc[r.id].parents.push({parent_address, relationship}); // short-hand property names allows us to use the variable names as keys
  return acc;
}, {}));

console.log(res);

যেহেতু আপনি উল্লেখ করেছেন যে আপনি জেএসে নতুন, তাই আরও আবশ্যক পদ্ধতিতে বোঝা আরও সহজ হতে পারে (বিশদগুলির জন্য কোড মন্তব্য দেখুন):

const users = [{ id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'USA', relationship: 'mother' }, { id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'Spain', relationship: 'father' }, { id: 2, name: 'Mark', email: 'mark@mail.com', age: 28, parent_address: 'France', relationship: 'father' } ];

const unique_map = {}; // create an object - store each id as a key, and an object with a parents array as its value
for(let i = 0; i < users.length; i++) { // loop your array object
  const user = users[i]; // get the current object
  const id = user.id; // get the current object/users's id
  
  if(!(id in unique_map)) // check if current user's id is in the the object
    unique_map[id] = { // add the id to the unique_map with an object as its associated value 
      id: id,
      name: user.name,
      email: user.email,
      age: user.age,
      parents: [] // add `parents` array to append to later
    }
    
  unique_map[id].parents.push({ // push the parent into the object's parents array
    parent_address: user.parent_address,
    relationship: user.relationship
  });
}

const result = Object.values(unique_map); // get all values in the unique_map
console.log(result);


ধন্যবাদ, আমি বিশদটি যাচাই করব এবং আপনার কোডটি পড়তে আমার খুব উপস্থিত রয়েছে।
ক্যাথি

ওহ এই কঠিন। reduceকলব্যাকে ডেস্ট্রাকচারিং অবজেক্টটি দুর্দান্ত , তবে কোনও নবজাতকের জন্য যদিও এটি কিছুটা ভারী হতে পারে।
TKoL

1
@ টি কোল ধন্যবাদ, আমি চেষ্টা করব এবং একটি "সহজ" সংস্করণ যুক্ত করব
নিক পার্সসন

1
সহজ সংস্করণ দুর্দান্ত দেখাচ্ছে!
TKoL

1
তোমাকে অনেক ধন্যবাদ. আমি আপনার কোডটি পড়েছি এবং বিশেষত দ্বিতীয় কোড স্নিপেটে বুঝতে সহজ। অন্যান্য সদস্যদের উত্তরের জন্যও কৃতজ্ঞ। আবার, আপনাকে অনেক ধন্যবাদ।
ক্যাথি

5

আপনি অ্যারে হ্রাস করতে এবং একই আইডি সহ কোনও ব্যবহারকারীকে অনুসন্ধান করতে এবং এটিতে পিতামাতার তথ্য যুক্ত করতে পারেন।

যদি ব্যবহারকারী না পাওয়া যায় তবে ফলাফল সেটটিতে একটি নতুন ব্যবহারকারী যুক্ত করুন।

const
    users = [{ id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'USA', relationship: 'mother' }, { id: 1, name: 'John', email: 'johnson@mail.com', age: 25, parent_address: 'Spain', relationship: 'father' }, { id: 2, name: 'Mark', email: 'mark@mail.com', age: 28, parent_address: 'France', relationship: 'father' }],
    grouped = users.reduce((r, { parent_address, relationship, ...user }) => {
        var temp = r.find(q => q.id === user.id );
        if (!temp) r.push(temp = { ...user, parent: []});
        temp.parent.push({ parent_address, relationship });
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }


2

এই জাতীয় ডেটা পুনর্গঠন করা বেশ সাধারণ এবং Array.reduce()কাজের জন্য ডিজাইন করা। এটি জিনিস দেখার একটি ভিন্ন উপায় এবং কিছুটা অভ্যস্ত হয়ে ওঠে তবে আপনি কোডটি কয়েকবার লেখার পরে এটি দ্বিতীয় প্রকৃতির হয়ে ওঠে।

reduce() অ্যারেতে ডাকা হয় এবং দুটি পরামিতি লাগে:

  1. অ্যারেতে প্রতিটি উপাদানগুলির জন্য ডাকা হবে এমন একটি ফাংশন
  2. আরম্ভের মান

আপনার ফাংশনটি তখন প্রতিটি উপাদানকে ডেকে আনা হয় রানের জন্য প্রাথমিক মান বা প্রতিটি পরবর্তী রানের জন্য পূর্ববর্তী ফাংশন কল থেকে রিটার্ন মান সহ অ্যারের উপাদান সহ, মূল অ্যারেতে সূচক এবং মূল অ্যারে যা হ্রাস করে ()) বলা হয়েছিল (শেষ দুটি সাধারণত উপেক্ষা করা হয় এবং খুব কমই প্রয়োজন হয়)। এটি যুক্ত হওয়া উপাদানটি বা আপনার বর্তমান উপাদান যুক্ত করে যা কিছু তৈরি করছে তা ফিরিয়ে দেওয়া উচিত, এবং সেই রিটার্ন মানটি আপনার ক্রিয়াকলাপের পরবর্তী কলটিতে চলে যায়।

এই জাতীয় জিনিসের জন্য আমার কাছে অনন্য কীগুলি (আপনার idজন্য) রাখার জন্য সাধারণত একটি অবজেক্ট থাকে তবে আমি আপনাকে দেখতে পাই যে অ্যারেটি ফিরে পাওয়া উচিত। এটি অ্যারেতে অবজেক্টটি এবং কীগুলি ম্যাপ করার জন্য একটি লাইন এবং আপনি ইতিমধ্যে কোনও আইডি যুক্ত করেছেন কিনা তা দেখার জন্য অ্যারে.ফাইন্ড () এর পরিবর্তে বিল্ট-ইন অবজেক্ট সম্পত্তি প্রক্রিয়াটি ব্যবহার করা আরও দক্ষ।

const users = [{
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'USA',
    relationship:'mother'
  },
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'Spain',
    relationship:'father'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent_address: 'France',
    relationship:'father'
  }
];

let combined = users.reduce(
  // function called for each element in the array
  (previous, element) => {
    // previous starts out as the empty object we pass as the second argument
    // and will be the return value from this function for every other element
    
    // create an object for the id on our 'previous' object if it doesn't exist,
    // if it does exist we will trust the name, email, and age from the first
    // instance
    previous[element.id] = previous[element.id] || {
      id: element.id,
      name: element.name,
      age: element.age,
      parents: []
    };
    
    // now add parent
    previous[element.id].parents.push({
      parent_address: element.parent_address,
      relationship: element.relationship
    });
    
    // return our updated object, which will be passed to the next call
    // and eventually returned
    return previous;
  },
  {} // initial value is an empty object, no ids yet
);

// transform object into array with elements in order by key
let list = Object.keys(combined).sort().map(key => combined[key]);

console.dir(list);


1

বর্তমান পদ্ধতিটি ব্যবহার করে আপনার পুনরাবৃত্তি করতে হবে। জটিলতা হ'ল ও (এন ^ 2)। (লুপ + ইনডেক্সঅফের জন্য)

আরও ভাল উপায় হ'ল অ্যারেটিকে সূচক করে এবং সদৃশ সনাক্তকরণ এবং অনুসন্ধানের জন্য অ্যারে কীটি ব্যবহার করুন।

উদাহরণ স্বরূপ:

const map = {};
users.forEach(user => {
    // Will return undefined if not exist
    let existing = map[user.id];
    if (!existing) {
        // If not exist, create new
        existing = {
            id: user.id,
            ...
            parents: [ {parent_address: user.parent_address, relationship: user.relationship ]
        }
    } else {
        // Otherwise, update only parents field
        // You can add other logic here, for example update fields if duplication is detected.
        existing.parents.push({parent_address: user.parent_address, relationship: user.relationship ]
        });
    }
    map[user.id] = existing;
})
// Convert the object to array
const list = map.values();

ধন্যবাদ, আমি বিশদটি যাচাই করব এবং আপনার কোডটি পড়তে আমার খুব উপস্থিত রয়েছে।
ক্যাথি

1
const users = [{
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'USA',
    relationship:'mother'
  },
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'Spain',
    relationship:'father'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent_address: 'France',
    relationship:'father'
  }
];
const updatedUsers = users.map(user => {
    return {
    id: user.id,
    name: user.name,
    email: user.email,
    age: user.age,
    parent: [{
        relationship: user.relationship,
        parent_address: user.parent_address,
    }]
}
})

const list = updatedUsers.reduce((acc, user) => {
    const findIndex = acc.findIndex(eachUser => eachUser.id === user.id && eachUser.email === user.email);
    if (findIndex < 0) {
        acc.push(user);
        return acc;
    } else {
    acc[findIndex].parent.push(user.parent);
    return acc; 
    }
}, []);
console.log(list)

1
একটি ব্যাখ্যা ক্রম হবে। উদাহরণস্বরূপ, আপনি কি পরিবর্তন করেছেন? এবং কেন?
পিটার মর্টেনসেন

1

আপনি Mapঅনন্য আইটেমগুলি সঞ্চয় করতে সংগ্রহ ব্যবহার করতে পারেন এবং এটি ব্যবহার করে কেবল পপুলেট করতে পারেন filter:

const unique = new Map(users.map(u=> 
    [u.id, {...u, parent: [...users.filter(f => f.id == u.id)]}]));

console.log(Array.from(unique, ([k, v])=> v)
    .map(s => ( { id: s.id, name: s.name, email: s.email, age:s.age, parent:s.parent })));

const users = [
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'USA',
    relationship: 'mother'
  },
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'Spain',
    relationship: 'father'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent_address: 'France',
    relationship: 'father'
  }
];

const unique = new Map(users.map(u=> 
    [u.id, {...u, parent: [...users.filter(f => f.id == u.id)]}]));

console.log(Array.from(unique, ([k, v])=> v).map(s => ( 
    { id: s.id, name: s.name, email: s.email, age:s.age, parent:s.parent })));


0

 const users = [{
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'USA',
    relationship:'mother'
  },
  {
    id: 1,
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    parent_address: 'Spain',
    relationship:'father'
  },
  {
    id: 2,
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    parent_address: 'France',
    relationship:'father'
  }
];
ids = new Map()
for (const user of users) {
  var newuser;
  if (ids.has(user.id)) {
    newuser = ids.get(user.id);
  } else {
    newuser = {};
    newuser.id = user.id;
    newuser.name = user.name;
    newuser.email = user.email;
    newuser.age = user.age;
    newuser.parent = [];
  }
  relationship = {};
  relationship.parent_address = user.parent_address;
  relationship.relationship = user.relationship;
  newuser.parent.push(relationship)
  ids.set(user.id, newuser);
}
list = [ ...ids.values() ];
list.forEach((u) => {
  console.log(JSON.stringify(u));
});

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.