জাভাস্ক্রিপ্টে দুটি বস্তুর অ্যারের মধ্যে পার্থক্য কীভাবে পাওয়া যায়


110

আমার দুটি ফলাফল সেট রয়েছে:

// Result 1
[
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
    { value: "4", display: "Ryan" }
]

// Result 2
[
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
]

আমার চূড়ান্ত ফলাফলটি হ'ল এই অ্যারেগুলির মধ্যে পার্থক্য - চূড়ান্ত ফলাফলটি এমন হওয়া উচিত:

[{ value: "4", display: "Ryan" }]

জাভাস্ক্রিপ্টে এরকম কিছু করা সম্ভব?


সুতরাং, আপনি সমস্ত উপাদানগুলির একটি অ্যারে চান যা উভয় অ্যারেতে দেখা যায় না , মান এবং প্রদর্শনের মাধ্যমে ফিল্টার করা হয়?
সেরব্রাস

আমি দুটি অ্যারের মধ্যে পার্থক্য চাই। মানটি অ্যারের যে কোনও একটিতে উপস্থিত থাকবে।
বিকেএম

: এখানে দেখুন stackoverflow.com/questions/10927722/...
Goran.it

4
এটি ফায়ারব্যাগ কনসোলটিতে লগ করার সময় অ্যারের মতো প্রদর্শিত হচ্ছে ...
মাইক সি

4
দুঃখিত, তবে জসন অবজেক্টটি ভুল ... আপনার জন্য = পরিবর্তন করতে হবে:
ওয়াল্টার জালাজার

উত্তর:


145

কেবল নেটিভ জেএস ব্যবহার করে এর মতো কিছু কাজ করবে:

a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]
b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]

function comparer(otherArray){
  return function(current){
    return otherArray.filter(function(other){
      return other.value == current.value && other.display == current.display
    }).length == 0;
  }
}

var onlyInA = a.filter(comparer(b));
var onlyInB = b.filter(comparer(a));

result = onlyInA.concat(onlyInB);

console.log(result);


4
এটি কাজ করে, এবং এটি সম্ভবত সেরা প্রত্যক্ষ উত্তর, তবে এটিকে এমন কিছুতে পরিণত করা ভাল লাগবে যা একটি প্রাক্কলিত এবং দুটি তালিকাকে গ্রহণ করে এবং দুটি তালিকার প্রতিসাম্যগত পার্থক্যটি যথাযথভাবে প্রয়োগের মাধ্যমে ফিরিয়ে দেয়। (অতিরিক্ত সমস্ত পয়েন্ট যদি এটি সমস্ত এম * এন তুলনায় দুইবার চালানোর চেয়ে বেশি দক্ষ হয়!)
স্কট স্যয়েট

@ স্কটসৌয়েত: আমি "প্রিডিকেট " শব্দটির সাথে পরিচিত নই (স্থানীয় ইংরেজী স্পিকার নয়)। এটা কি return a.value ===...আপনার উত্তরে? (ভাল সমাধান, যাইহোক, +1) ব্যবহার বাদে Array.prototype.some(), আমি সত্যিই এটি করার আরও দক্ষ / খাটো উপায় খুঁজে পাচ্ছি না।
সেরব্রাস

4
@ সার্ব্রাস: হ্যাঁ একটি শিকারী হ'ল একটি ফাংশন যা একটি বুলিয়ান ( trueবা falseমান।) প্রদান করে this এক্ষেত্রে আমরা যদি ব্যবহারকারীকে একটি ফাংশন হিসাবে সমতা চেকটি পাস করার প্রয়োজনের দ্বারা বাকী কোড থেকে সাম্যের জন্য পরীক্ষার ধারণাটি পৃথক করি, আমরা করতে পারি একটি সোজা জেনেরিক অ্যালগরিদম।
স্কট স্যয়েট

@ স্কটসৌয়েত: আমার এই উত্তরটি আবার খুঁজে পেতে আমার কিছুটা সময় লেগেছে, তবে এখন এটি বেশ খানিকটা ভাল হয়েছে: ডি
সার্বারুস

ES6 কনস্টেটর = (অন্যান্যআররে) => (বর্তমান) => অন্যান্যআরআ.ফিল্টার ((অন্যান্য) => অন্যান্য.ভ্যালু == বর্তমান.মূল্য && অন্যান্য.ডিসপ্লে == বর্তমান.ডিসপ্লে) দৈর্ঘ্য == 0;
শনিগি

71

আপনি Array.prototype.filter()মিশ্রণে ব্যবহার করতে পারে Array.prototype.some()

এখানে একটি উদাহরণ রয়েছে (ধরে নিলাম আপনার অ্যারেগুলি ভেরিয়েবলগুলিতে সঞ্চিত আছে result1এবং result2):

//Find values that are in result1 but not in result2
var uniqueResultOne = result1.filter(function(obj) {
    return !result2.some(function(obj2) {
        return obj.value == obj2.value;
    });
});

//Find values that are in result2 but not in result1
var uniqueResultTwo = result2.filter(function(obj) {
    return !result1.some(function(obj2) {
        return obj.value == obj2.value;
    });
});

//Combine the two arrays of unique entries
var result = uniqueResultOne.concat(uniqueResultTwo);

52

যারা ES6- এ ওয়ান-লাইনারের সমাধান পছন্দ করেন তাদের জন্য এই জাতীয় কিছু:

const arrayOne = [ 
  { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer" },
  { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed" },
  { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi" },
  { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal" },
  { value: "a63a6f77-c637-454e-abf2-dfb9b543af6c", display: "Ryan" },
];
          
const arrayTwo = [
  { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer"},
  { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed"},
  { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi"},
  { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal"},
];

const results = arrayOne.filter(({ value: id1 }) => !arrayTwo.some(({ value: id2 }) => id2 === id1));

console.log(results);


4
দয়া করে এটি ব্যাখ্যা করুন!
ব্রুনো ব্রিটো

আমি এই সমাধানটি পছন্দ করি। এটি কেবলমাত্র একটি মূল্য সম্পত্তি দিয়ে একটি অস্থায়ী বস্তু তৈরি করে, তাই এটি ছোট রাখুন
ডেনউইলিয়ামিয়ামসিল

16

আমি কিছুটা সাধারণ-উদ্দেশ্যমূলক কৌশল গ্রহণ করি, যদিও @ কার্বারাস এবং @ ক্যাস্পার মোয়ারচের উভয় পদ্ধতির মতামতের সাথে একই রকম । আমি একটি ফাংশন তৈরি করি যা একটি প্রাকটিকে গ্রহণ করে যা দুটি বস্তু সমান কিনা তা নির্ধারণ করার জন্য (এখানে আমরা $$hashKeyসম্পত্তিটিকে উপেক্ষা করি তবে এটি কোনও কিছু হতে পারে) এবং একটি ফাংশন ফেরত যা সেই প্রস্তাবের উপর ভিত্তি করে দুটি তালিকার প্রতিসাম্যগত পার্থক্য গণনা করে:

a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]
b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]

var makeSymmDiffFunc = (function() {
    var contains = function(pred, a, list) {
        var idx = -1, len = list.length;
        while (++idx < len) {if (pred(a, list[idx])) {return true;}}
        return false;
    };
    var complement = function(pred, a, b) {
        return a.filter(function(elem) {return !contains(pred, elem, b);});
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };
}());

var myDiff = makeSymmDiffFunc(function(x, y) {
    return x.value === y.value && x.display === y.display;
});

var result = myDiff(a, b); //=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}

সেরিবাসের কাছে যাওয়ার (যেমন ক্যাস্পার মোয়ার্কের পদ্ধতির মতো) এটির একটি ছোট সুবিধা রয়েছে যে এটি দ্রুত পালিয়ে যায়; যদি এটি কোনও মিল খুঁজে পায়, তবে এটি তালিকার বাকী অংশগুলি পরীক্ষা করে বিরক্ত করে না। আমার যদি কোনও curryকার্যকারিতা সহজ হয় তবে আমি এটি কিছুটা ভিন্নভাবে করতাম তবে এটি কাজ করে।

ব্যাখ্যা

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

আমরা নিম্নলিখিত ফাংশনটি এখানে পাস করি makeSymmDiffFunc:

function(x, y) {
    return x.value === y.value && x.display === y.display;
}

এই ফাংশনটি আমরা কীভাবে সিদ্ধান্ত নিই যে দুটি বস্তু সমান। ফিরে আসা সমস্ত ফাংশনের মতো trueবা falseএটিকে "প্রিডিকেট ফাংশন" বলা যেতে পারে তবে এটি কেবল পরিভাষা। মূল বক্তব্যটি হ'ল makeSymmDiffFuncএকটি ফাংশন দিয়ে কনফিগার করা হয়েছে যা দুটি বস্তু গ্রহণ করে এবং trueযদি আমরা সেগুলি সমান বিবেচনা না করি তবে ফিরে আসে false

এটি ব্যবহার করে makeSymmDiffFunc(পড়ুন "প্রতিসম পার্থক্য ফাংশন তৈরি করুন") আমাদের একটি নতুন ফাংশন প্রদান করে:

        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };

এটি আসলে আমরা ব্যবহার করব এই ফাংশন। আমরা এটি দুটি তালিকা পাস করি এবং এটি প্রথমটিতে নয় প্রথমটিতে উপাদানগুলির সন্ধান করে, তারপরে দ্বিতীয়টিতে প্রথমটি নয় এবং এই দুটি তালিকাকে একত্রিত করে।

আবার এটি সন্ধান করা, যদিও, আমি অবশ্যই আপনার কোড থেকে একটি সূত্র গ্রহণ করতে এবং ব্যবহার করে মূল ফাংশনটি বেশ কিছুটা সহজ করতে পেরেছিলাম some:

var makeSymmDiffFunc = (function() {
    var complement = function(pred, a, b) {
        return a.filter(function(x) {
            return !b.some(function(y) {return pred(x, y);});
        });
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };
}());

complementশিকারী ব্যবহার করে এবং এটির প্রথম তালিকার উপাদানগুলি তার দ্বিতীয়টিতে নয় returns এটি আলাদা containsফাংশন সহ আমার প্রথম পাসের চেয়ে সহজ simp

শেষ অবধি , অভ্যন্তরীণ complementফাংশনটিকে বৈশ্বিক পরিধি থেকে দূরে রাখতে মূল ফাংশনটি তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন ( IIFE ) এ মোড়ানো হয় ।


আপডেট, কয়েক বছর পরে

এখন যে ES2015 বেশ ভাল সর্বব্যাপী হয়ে উঠেছে, আমি একই কৌশলটি অনেক কম বয়লারপ্লেটের সাথে পরামর্শ করব:

const diffBy = (pred) => (a, b) => a.filter(x => !b.some(y => pred(x, y)))
const makeSymmDiffFunc = (pred) => (a, b) => diffBy(pred)(a, b).concat(diffBy(pred)(b, a))

const myDiff = makeSymmDiffFunc((x, y) => x.value === y.value && x.display === y.display)

const result = myDiff(a, b)
//=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}

4
আপনি কি আপনার কোডটিতে আরও কিছু ব্যাখ্যা যুক্ত করতে পারেন? আমি নিশ্চিত নই যে জাভাস্ক্রিপ্টের কোনও শিক্ষানবিস বুঝতে পারবেন কীভাবে প্রাকটিক-অ্যাপ্রোচ কাজ করে।
kaspermoerch

4
@ ক্যাস্পারমোরচ: একটি দীর্ঘ ব্যাখ্যা যুক্ত করেছেন Added আমি আশা করি এটি সাহায্য করবে. (এটি আমাকে এই কোডটি থাকা উচিত একটি গুরুতর পরিষ্কার-পরিচ্ছন্নতার স্বীকৃতি দেয়))
স্কট স্যয়েট

10
import differenceBy from 'lodash/differenceBy'

const myDifferences = differenceBy(Result1, Result2, 'value')

এটি দুটি বস্তুর অ্যারের মধ্যে পার্থক্যটি ফিরিয়ে আনবে, valueতাদের তুলনা করার জন্য কীটি ব্যবহার করে। নোটটি একই মান সহ দুটি জিনিস ফিরে আসবে না, কারণ অন্যান্য কী উপেক্ষা করা হবে।

এটি লোডাসের একটি অংশ ।


উপরের জসন বস্তুটি ভুল। যখন এইভাবে চেষ্টা করুন পরিবর্তন করুন = এর জন্য:
ওয়াল্টার জালাজার

7

আপনি অ্যারের প্রতিটি বস্তুর সাথে সম্পর্কিত অনন্য মান হিসাবে কীগুলির সাথে একটি অবজেক্ট তৈরি করতে পারেন এবং তারপরে অন্যের অবজেক্টে কীটির অস্তিত্বের ভিত্তিতে প্রতিটি অ্যারে ফিল্টার করতে পারেন। এটি অপারেশনের জটিলতা হ্রাস করে।

ES6

let a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}];
let b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}];

let valuesA = a.reduce((a,{value}) => Object.assign(a, {[value]:value}), {});
let valuesB = b.reduce((a,{value}) => Object.assign(a, {[value]:value}), {});
let result = [...a.filter(({value}) => !valuesB[value]), ...b.filter(({value}) => !valuesA[value])];
console.log(result);

ES5

var a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}];
var b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}];

var valuesA = a.reduce(function(a,c){a[c.value] = c.value; return a; }, {});
var valuesB = b.reduce(function(a,c){a[c.value] = c.value; return a; }, {});
var result = a.filter(function(c){ return !valuesB[c.value]}).concat(b.filter(function(c){ return !valuesA[c.value]}));
console.log(result);


5

আমি মনে করি @ সার্বারাস সমাধানটি স্পট রয়েছে। আমি একই সমাধানটি প্রয়োগ করেছি তবে পুনরায় কোডটি নিজস্ব ফাংশন (ডিআরওয়াই) এ বের করেছি।

 function filterByDifference(array1, array2, compareField) {
  var onlyInA = differenceInFirstArray(array1, array2, compareField);
  var onlyInb = differenceInFirstArray(array2, array1, compareField);
  return onlyInA.concat(onlyInb);
}

function differenceInFirstArray(array1, array2, compareField) {
  return array1.filter(function (current) {
    return array2.filter(function (current_b) {
        return current_b[compareField] === current[compareField];
      }).length == 0;
  });
}

4

আমি ফিল্টার এবং কিছু ব্যবহার করে এই সমাধানটি পেয়েছি।

resultFilter = (firstArray, secondArray) => {
  return firstArray.filter(firstArrayItem =>
    !secondArray.some(
      secondArrayItem => firstArrayItem._user === secondArrayItem._user
    )
  );
};


2

আপনি একটি উপর বি বি এবং ডিফ ডি করতে পারেন, তারপরে উভয় ফলাফল একত্রিত করুন

let a = [
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
    { value: "4", display: "Ryan" }
]

let b = [
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" }
]

// b diff a
let resultA = b.filter(elm => !a.map(elm => JSON.stringify(elm)).includes(JSON.stringify(elm)));

// a diff b
let resultB = a.filter(elm => !b.map(elm => JSON.stringify(elm)).includes(JSON.stringify(elm)));  

// show merge 
console.log([...resultA, ...resultB]);


1

এখানে বেশিরভাগ উত্তরই জটিল, তবে এটিকে সহজ করার পেছনে কি যুক্তি নেই?

  1. কোন অ্যারে দীর্ঘতর তা পরীক্ষা করুন এবং এটিকে প্রথম প্যারামিটার হিসাবে সরবরাহ করুন (দৈর্ঘ্য সমান হলে প্যারামিটারগুলি অর্ডার দেয় না)
  2. অ্যারে ওভার 1।
  3. অ্যারে 1 এর বর্তমান পুনরাবৃত্ত উপাদানের জন্য এটি অ্যারে 2 এ উপস্থিত কিনা তা পরীক্ষা করুন
  4. এটি উপস্থিত না থাকলে, চেয়ে
  5. এটিকে 'ডিফারেন্স' অ্যারেতে চাপ দিন
const getArraysDifference = (longerArray, array2) => {
  const difference = [];

  longerArray.forEach(el1 => {      /*1*/
    el1IsPresentInArr2 = array2.some(el2 => el2.value === el1.value); /*2*/

    if (!el1IsPresentInArr2) { /*3*/
      difference.push(el1);    /*4*/
    }
  });

  return difference;
}

O (n ^ 2) জটিলতা।


4
জটিলতা অন্তর্ভুক্তির জন্য প্লাস 1
ডেলাভাগো 1999

0

আমি একটি সাধারণ বৈষম্য তৈরি করেছি যা যে কোনও ধরণের 2 টি অবজেক্টের সাথে তুলনা করে এবং একটি পরিবর্তনের হ্যান্ডলার gist.github.com/bortunac "diff.js" চালানোর জন্য ব্যবহার করতে পারেন:

old_obj={a:1,b:2,c:[1,2]}
now_obj={a:2 , c:[1,3,5],d:55}

সুতরাং সম্পত্তি ক পরিমার্জন করা হয়, খ মুছে ফেলা হয়, সি পরিবর্তিত হয়, ডি যোগ করা হয়

var handler=function(type,pointer){
console.log(type,pointer,this.old.point(pointer)," | ",this.now.point(pointer)); 

}

এখন মত ব্যবহার করুন

df=new diff();
df.analize(now_obj,old_obj);
df.react(handler);

কনসোলটি প্রদর্শন করবে

mdf ["a"]  1 | 2 
mdf ["c", "1"]  2 | 3 
add ["c", "2"]  undefined | 5 
add ["d"]  undefined | 55 
del ["b"]  2 | undefined 

0

সর্বাধিক জেনেরিক এবং সহজ উপায়:

findObject(listOfObjects, objectToSearch) {
    let found = false, matchingKeys = 0;
    for(let object of listOfObjects) {
        found = false;
        matchingKeys = 0;
        for(let key of Object.keys(object)) {
            if(object[key]==objectToSearch[key]) matchingKeys++;
        }
        if(matchingKeys==Object.keys(object).length) {
            found = true;
            break;
        }
    }
    return found;
}

get_removed_list_of_objects(old_array, new_array) {
    // console.log('old:',old_array);
    // console.log('new:',new_array);
    let foundList = [];
    for(let object of old_array) {
        if(!this.findObject(new_array, object)) foundList.push(object);
    }
    return foundList;
}

get_added_list_of_objects(old_array, new_array) {
    let foundList = [];
    for(let object of new_array) {
        if(!this.findObject(old_array, object)) foundList.push(object);
    }
    return foundList;
}

0

যখন বড় অ্যারে আসে তখন আমি মানচিত্রের বিষয়টিকে পছন্দ করি।

// create tow arrays
array1 = Array.from({length: 400},() => ({value:Math.floor(Math.random() * 4000)}))
array2 = Array.from({length: 400},() => ({value:Math.floor(Math.random() * 4000)}))

// calc diff with some function
console.time('diff with some');
results = array2.filter(({ value: id1 }) => array1.some(({ value: id2 }) => id2 === id1));
console.log('diff results ',results.length)
console.timeEnd('diff with some');

// calc diff with map object
console.time('diff with map');
array1Map = {};
for(const item1 of array1){
    array1Map[item1.value] = true;
}
results = array2.filter(({ value: id2 }) => array1Map[id2]);
console.log('map results ',results.length)
console.timeEnd('diff with map');


0

জাভাস্ক্রিপ্টে মানচিত্র রয়েছে যা ও (1) সন্নিবেশ এবং দেখার সময় সরবরাহ করে। সুতরাং এটি ও (এন) এ সমাধান করা যেতে পারে (এবং অন্যান্য (সমস্ত উত্তরগুলির মতো ও (এনও)) নয়। তার জন্য, প্রতিটি বস্তুর জন্য একটি অনন্য আদিম (স্ট্রিং / সংখ্যা) কী তৈরি করা প্রয়োজন। একটি হতে পারে JSON.stringifyতবে উপাদানগুলির ক্রম সাম্যকে প্রভাবিত করতে পারে বলে এটি যথেষ্ট ত্রুটিযুক্ত:

 JSON.stringify({ a: 1, b: 2 }) !== JSON.stringify({ b: 2, a: 1 })

অতএব, আমি এমন একটি সীমানা গ্রহণ করব যা মানগুলির কোনওরূপে উপস্থিত না হয় এবং নিজেই একটি স্ট্রিং রচনা করে:

const toHash = value => value.value + "@" + value.display;

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

const entries = new Map();

for(const el of [...firstArray, ...secondArray]) {
  const key = toHash(el);
  if(entries.has(key)) {
    entries.delete(key);
  } else {
    entries.set(key, el);
  }
}

const result = [...entries.values()];


0

একটি অ্যারের মধ্যে প্রথম আইটেমটি অন্য অ্যারেতে মানগুলির সাথে মেলে না এবং এটি অ্যারে.ফাইন্ড () এবং অ্যারে.ফিল্টার () এর মতো শেষ পর্যন্ত সাজানোর ব্যবস্থা করেছিলাম এমন উপায় অনুসন্ধান করার সময় আমি এই প্রশ্নটি জুড়ে এসেছি এই

var carList= ['mercedes', 'lamborghini', 'bmw', 'honda', 'chrysler'];
var declinedOptions = ['mercedes', 'lamborghini'];

const nextOption = carList.find(car=>{
    const duplicate = declinedOptions.filter(declined=> {
      return declined === car
    })
    console.log('duplicate:',duplicate) //should list out each declined option
    if(duplicate.length === 0){//if theres no duplicate, thats the nextOption
      return car
    }
})

console.log('nextOption:', nextOption);
//expected outputs
//duplicate: mercedes
//duplicate: lamborghini
//duplicate: []
//nextOption: bmw

পরবর্তী সেরা বিকল্পের জন্য ক্রস-চেক করার আগে যদি আপনাকে একটি আপডেট তালিকা আনতে হয় তবে এটি যথেষ্ট ভাল কাজ করা উচিত :)


0

তদতিরিক্ত, পৃথক দুটি বস্তু অ্যারে বলুন key value

// Array Object 1
const arrayObjOne = [
    { userId: "1", display: "Jamsheer" },
    { userId: "2", display: "Muhammed" },
    { userId: "3", display: "Ravi" },
    { userId: "4", display: "Ajmal" },
    { userId: "5", display: "Ryan" }
]

// Array Object 2
const arrayObjTwo =[
    { empId: "1", display: "Jamsheer", designation:"Jr. Officer" },
    { empId: "2", display: "Muhammed", designation:"Jr. Officer" },
    { empId: "3", display: "Ravi", designation:"Sr. Officer" },
    { empId: "4", display: "Ajmal", designation:"Ast. Manager" },
]

আপনি ব্যবহার করতে পারেন filterমধ্যে es5বা native jssubstract দুই অ্যারে বস্তু।

//Find data that are in arrayObjOne but not in arrayObjTwo
var uniqueResultArrayObjOne = arrayObjOne.filter(function(objOne) {
    return !arrayObjTwo.some(function(objTwo) {
        return objOne.userId == objTwo.empId;
    });
});

ইন ES6আপনার সাথে তীর ফাংশন ব্যবহার করতে পারেন অবজেক্ট ডেসট্রাকচারিং এর ES6

const ResultArrayObjOne = arrayObjOne.filter(({ userId: userId }) => !arrayObjTwo.some(({ empId: empId }) => empId === userId));

console.log(ResultArrayObjOne);

0

let obj1 =[
                 { id: 1, submenu_name: 'login' },
                 { id: 2, submenu_name: 'Profile',}, 
                 { id: 3, submenu_name: 'password',  },  
                 { id: 4, submenu_name: 'reset',}
               ] ;
 let obj2 =[
                 { id: 2}, 
                 { id: 3 },
               ] ;
               
// Need Similar obj 
const result1 = obj1.filter(function(o1){
 return obj2.some(function(o2){
    return o1.id == o2.id;          // id is unnique both array object
  });
});
 console.log(result1);



// Need differnt obj 
 const result2 = obj1.filter(function(o1){
 return !obj2.some(function(o2){    //  for diffrent we use NOT (!) befor obj2 here
    return o1.id == o2.id;          // id is unnique both array object
  });
});
 console.log(result2);


-3

আপনি যদি বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করতে ইচ্ছুক হন তবে এটি অর্জনের জন্য আপনি আন্ডারস্কোর.জেজে _.differences ব্যবহার করতে পারেন। _. ডিফারেন্স অ্যারে থেকে মানগুলি প্রদান করে যা অন্যান্য অ্যারেতে উপস্থিত নেই।

_.difference([1,2,3,4,5][1,4,10])

==>[2,3,5]

12
এটি কেবল প্রাথমিক মান সহ অ্যারেগুলিতে কাজ করে। যদি অ্যারেতে অবজেক্টগুলির একটি তালিকা থাকে, যেমন এই প্রশ্নটি জিজ্ঞাসা করে, এটি কাজ করবে না কারণ এটি বস্তুর নিজের পরিবর্তে রেফারেন্সগুলি তুলনা করার চেষ্টা করে, যার প্রায়শই সর্বদা অর্থ হবে যে সবকিছু আলাদা।
রস পিপলস

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