জাভাস্ক্রিপ্টে অ্যারে ছেদগুলি কার্যকর করার জন্য সবচেয়ে সহজ, গ্রন্থাগার-মুক্ত কোড কী? আমি লিখতে চাই
intersection([1,2,3], [2,3,4,5])
এবং পেতে
[2, 3]
break
থেকে Simple js loops
অপস বৃদ্ধি / সেকেন্ড ~ 10M থেকে
জাভাস্ক্রিপ্টে অ্যারে ছেদগুলি কার্যকর করার জন্য সবচেয়ে সহজ, গ্রন্থাগার-মুক্ত কোড কী? আমি লিখতে চাই
intersection([1,2,3], [2,3,4,5])
এবং পেতে
[2, 3]
break
থেকে Simple js loops
অপস বৃদ্ধি / সেকেন্ড ~ 10M থেকে
উত্তর:
Array.prototype.filter
এবং এর সমন্বয় ব্যবহার করুন Array.prototype.indexOf
:
array1.filter(value => -1 !== array2.indexOf(value))
বা মন্তব্যগুলিতে ভ্রোগেহেগেল যেমন পরামর্শ দিয়েছেন, আপনি Array.prototype.includes
আরও সহজ কোডের জন্য আরও সাম্প্রতিক ব্যবহার করতে পারেন :
array1.filter(value => array2.includes(value))
পুরানো ব্রাউজারগুলির জন্য:
array1.filter(function(n) {
return array2.indexOf(n) !== -1;
});
intersection([1,2,1,1,3], [1])
আয় [1, 1, 1]
। এটা ঠিক ফিরে আসা উচিত নয় [1]
?
array2.indexOf(n) != -1
একের পরিবর্তে array2.includes(n)
আরও সহজ কোডের জন্যও লিখতে পারেন ।
ধ্বংসাত্মকটি সহজ বলে মনে হচ্ছে, বিশেষত যদি আমরা ধরে নিতে পারি যে ইনপুটটি সাজানো হয়েছে:
/* destructively finds the intersection of
* two arrays in a simple fashion.
*
* PARAMS
* a - first array, must already be sorted
* b - second array, must already be sorted
*
* NOTES
* State of input arrays is undefined when
* the function returns. They should be
* (prolly) be dumped.
*
* Should have O(n) operations, where n is
* n = MIN(a.length, b.length)
*/
function intersection_destructive(a, b)
{
var result = [];
while( a.length > 0 && b.length > 0 )
{
if (a[0] < b[0] ){ a.shift(); }
else if (a[0] > b[0] ){ b.shift(); }
else /* they're equal */
{
result.push(a.shift());
b.shift();
}
}
return result;
}
আমাদের সূচকগুলি ট্র্যাক করতে করতে যেহেতু অ-ধ্বংসাত্মক চুলকে আরও জটিল হতে হবে:
/* finds the intersection of
* two arrays in a simple fashion.
*
* PARAMS
* a - first array, must already be sorted
* b - second array, must already be sorted
*
* NOTES
*
* Should have O(n) operations, where n is
* n = MIN(a.length(), b.length())
*/
function intersect_safe(a, b)
{
var ai=0, bi=0;
var result = [];
while( ai < a.length && bi < b.length )
{
if (a[ai] < b[bi] ){ ai++; }
else if (a[ai] > b[bi] ){ bi++; }
else /* they're equal */
{
result.push(a[ai]);
ai++;
bi++;
}
}
return result;
}
intersect_safe
: length
অ্যারেতে একটি সম্পত্তি, কোনও পদ্ধতি নয়। এখানে একটি অঘোষিত ভেরিয়েবল i
রয়েছে result.push(a[i]);
। পরিশেষে, এটি সাধারণ ক্ষেত্রে সহজভাবে কাজ করে না: দুটি অবজেক্ট যেখানে >
অপারেটর অনুসারে অপরের চেয়ে বড় হয় না তা অগত্যা সমান হয় না। intersect_safe( [ {} ], [ {} ] )
উদাহরণস্বরূপ, একবারে (পূর্বে উল্লিখিত ত্রুটিগুলি স্থির হয়ে গেলে) একটি উপাদান সহ একটি অ্যারে দেবে, যা স্পষ্টতই ভুল।
.slice(0)
সূচিগুলি intersect_safe
ট্র্যাক করার পরিবর্তে অ্যারের ক্লোন তৈরি করতে ব্যবহার করতে পারেন ।
যদি আপনার পরিবেশ ECMAScript 6 সেটটিকে সমর্থন করে তবে একটি সহজ এবং অনুমিত দক্ষ (স্পেসিফিকেশন লিঙ্কটি দেখুন) উপায়:
function intersect(a, b) {
var setA = new Set(a);
var setB = new Set(b);
var intersection = new Set([...setA].filter(x => setB.has(x)));
return Array.from(intersection);
}
খাটো, তবে কম পঠনযোগ্য (অতিরিক্ত চৌরাস্তা তৈরি না করেও Set
):
function intersect(a, b) {
return [...new Set(a)].filter(x => new Set(b).has(x));
}
প্রতিটি সময় Set
থেকে একটি নতুন এড়ানো b
:
function intersect(a, b) {
var setB = new Set(b);
return [...new Set(a)].filter(x => setB.has(x));
}
নোট করুন যে সেটগুলি ব্যবহার করার সময় আপনি কেবল আলাদা মান পাবেন new Set[1,2,3,3].size
মূল্যায়ন করে 3
।
[...setA]
সিনট্যাক্স কি ? কিছু বিশেষ ধরণের জাভাস্ক্রিপ্ট অপারেশন?
x => new Set(b).has(x)
তীর ফাংশনটি প্রতিবার কার্যকর হওয়ার পরে সেটগুলিতে পরিণত b
হয় না ? আপনার সম্ভবত সেই সেটটি কোনও চলকতে সংরক্ষণ করা উচিত।
ব্যবহার Underscore.js বা lodash.js
_.intersection( [0,345,324] , [1,0,324] ) // gives [0,324]
ES6 পদগুলিতে আমার অবদান। সাধারণত এটি আর্গুমেন্ট হিসাবে সরবরাহ করা অনির্দিষ্ট সংখ্যক অ্যারে সহ একটি অ্যারের ছেদ খুঁজে পায়।
Array.prototype.intersect = function(...a) {
return [this,...a].reduce((p,c) => p.filter(e => c.includes(e)));
}
var arrs = [[0,2,4,6,8],[4,5,6,7],[4,6]],
arr = [0,1,2,3,4,5,6,7,8,9];
document.write("<pre>" + JSON.stringify(arr.intersect(...arrs)) + "</pre>");
[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8],[4,5,6,7],[4,6]]
এবং তারপরে প্রয়োগ হয় .reduce()
। প্রথম [0,1,2,3,4,5,6,7,8,9].filter( e => [0,2,4,6,8].includes(e)
অপারেশন সঞ্চালিত হয় এবং ফলে নতুন হয়ে p
এবং c
হয়ে [4,5,6,7]
পরবর্তী ঘুরে এবং আপ তাই চলতে থাকে যতক্ষণ আছে আর c
ছেড়ে দেওয়া হয়।
prototype
অহেতুক পরিবর্তন করবেন না ।
// Return elements of array a that are also in b in linear time:
function intersect(a, b) {
return a.filter(Set.prototype.has, new Set(b));
}
// Example:
console.log(intersect([1,2,3], [2,3,4,5]));
আমি উপরের সংক্ষিপ্ত সমাধানের সুপারিশ করছি যা বড় ইনপুটগুলিতে অন্যান্য প্রয়োগগুলি কার্যকর করে। যদি ছোট ইনপুট বিষয়গুলিতে পারফরম্যান্স হয় তবে নীচের বিকল্পগুলি দেখুন।
বিকল্প এবং পারফরম্যান্স তুলনা:
বিকল্প বাস্তবায়নের জন্য নীচের স্নিপেটটি দেখুন এবং পারফরম্যান্স তুলনার জন্য https://jsperf.com/array-intersication- তুলনা পরীক্ষা করুন ।
ফায়ারফক্স 53 এর ফলাফল:
বৃহত অ্যারেগুলিতে অপস / সেকেন্ড (10,000 টি উপাদান):
filter + has (this) 523 (this answer)
for + has 482
for-loop + in 279
filter + in 242
for-loops 24
filter + includes 14
filter + indexOf 10
ছোট অ্যারেগুলিতে অপস / সেকেন্ড (100 উপাদান):
for-loop + in 384,426
filter + in 192,066
for-loops 159,137
filter + includes 104,068
filter + indexOf 71,598
filter + has (this) 43,531 (this answer)
filter + has (arrow function) 35,588
intersect([1,2,2,3], [2,3,4,5])
আয় [2, 2, 3]
।
a.filter(b.includes)
। এটি যথেষ্ট দ্রুত চালানো উচিত (আপনার ফাংশন আপগ্রেডের মতো)।
কীভাবে কেবল সাহসী অ্যারে ব্যবহার করবেন?
function intersect(a, b) {
var d1 = {};
var d2 = {};
var results = [];
for (var i = 0; i < a.length; i++) {
d1[a[i]] = true;
}
for (var j = 0; j < b.length; j++) {
d2[b[j]] = true;
}
for (var k in d1) {
if (d2[k])
results.push(k);
}
return results;
}
সম্পাদনা:
// new version
function intersect(a, b) {
var d = {};
var results = [];
for (var i = 0; i < b.length; i++) {
d[b[i]] = true;
}
for (var j = 0; j < a.length; j++) {
if (d[a[j]])
results.push(a[j]);
}
return results;
}
Object.prototype
।
d[b[i]] = true;
পরিবর্তে d[b[j]] = true;
( i
না j
) হওয়া উচিত। তবে সম্পাদনার জন্য 6 টি অক্ষর প্রয়োজন।
এরকম কিছু, যদিও ভালভাবে পরীক্ষা করা হয়নি।
function intersection(x,y){
x.sort();y.sort();
var i=j=0;ret=[];
while(i<x.length && j<y.length){
if(x[i]<y[j])i++;
else if(y[j]<x[i])j++;
else {
ret.push(x[i]);
i++,j++;
}
}
return ret;
}
alert(intersection([1,2,3], [2,3,4,5]));
পিএস: অ্যালগোরিদম কেবল সংখ্যা এবং সাধারণ স্ট্রিংয়ের জন্য উদ্দেশ্যে করা হয়, স্বেচ্ছাসেবী বস্তুর অ্যারেগুলির ছেদ কাজ করে না।
আদিমদের বাছাই করা অ্যারেগুলিতে @ অটকের বাস্তবায়নের সম্পাদনা। শিফটের পরিবর্তে .pop ব্যবহার করে উন্নত করা যেতে পারে।
function intersect(array1, array2) {
var result = [];
// Don't destroy the original arrays
var a = array1.slice(0);
var b = array2.slice(0);
var aLast = a.length - 1;
var bLast = b.length - 1;
while (aLast >= 0 && bLast >= 0) {
if (a[aLast] > b[bLast] ) {
a.pop();
aLast--;
} else if (a[aLast] < b[bLast] ){
b.pop();
bLast--;
} else /* they're equal */ {
result.push(a.pop());
b.pop();
aLast--;
bLast--;
}
}
return result;
}
আমি jscreen: http://bit.ly/P9FrZK ব্যবহার করে একটি মাপদণ্ড তৈরি করেছি । .Pop ব্যবহার করা প্রায় তিনগুণ দ্রুত।
a[aLast] > b[bLast]
করেন তবে এটি স্ট্রিংগুলিতে কাজ করবে। a[aLast].localeCompare(b[bLast]) > 0
else if
.pop
ও (1) এবং .shift()
এটি ও (এন)
JQuery ব্যবহার :
var a = [1,2,3];
var b = [2,3,4,5];
var c = $(b).not($(b).not(a));
alert(c);
c = $(b).filter(a);
, তবে আমি এই ধরণের অ্যারে ম্যানিপুলেশনের জন্য jQuery এর উপর নির্ভর করার পরামর্শ দেব না কারণ ডকুমেন্টেশনে কেবল উল্লেখ করা হয়েছে যে এটি উপাদানগুলির জন্য কাজ করে।
কেবলমাত্র স্ট্রিং বা সংখ্যা সম্বলিত অ্যারেগুলির জন্য আপনি অন্যান্য উত্তরগুলির কয়েকটি অনুসারে বাছাই করে কিছু করতে পারেন। স্বেচ্ছাসেবী বস্তুর অ্যারেগুলির সাধারণ ক্ষেত্রে আমি মনে করি না আপনি এটি দীর্ঘতর করে এড়াতে পারবেন। নিম্নলিখিতটি আপনাকে প্যারামিটার হিসাবে সরবরাহ করা কোনও সংখ্যক অ্যারেগুলির ছেদ দেবে arrayIntersection
:
var arrayContains = Array.prototype.indexOf ?
function(arr, val) {
return arr.indexOf(val) > -1;
} :
function(arr, val) {
var i = arr.length;
while (i--) {
if (arr[i] === val) {
return true;
}
}
return false;
};
function arrayIntersection() {
var val, arrayCount, firstArray, i, j, intersection = [], missing;
var arrays = Array.prototype.slice.call(arguments); // Convert arguments into a real array
// Search for common values
firstArray = arrays.pop();
if (firstArray) {
j = firstArray.length;
arrayCount = arrays.length;
while (j--) {
val = firstArray[j];
missing = false;
// Check val is present in each remaining array
i = arrayCount;
while (!missing && i--) {
if ( !arrayContains(arrays[i], val) ) {
missing = true;
}
}
if (!missing) {
intersection.push(val);
}
}
}
return intersection;
}
arrayIntersection( [1, 2, 3, "a"], [1, "a", 2], ["a", 1] ); // Gives [1, "a"];
firstArr
বা firstArray
এবং তথ্যসূত্র সব আপডেট করা হয়নি। সংশোধন করা হয়েছে।
এটি ES2015 এবং সেটগুলি ব্যবহার করে খুব ছোট। স্ট্রিংয়ের মতো অ্যারের মতো মানগুলি গ্রহণ করে এবং সদৃশগুলি সরিয়ে দেয়।
let intersection = function(a, b) {
a = new Set(a), b = new Set(b);
return [...a].filter(v => b.has(v));
};
console.log(intersection([1,2,1,2,3], [2,3,5,4,5,3]));
console.log(intersection('ccaabbab', 'addb').join(''));
আপনি একটি ব্যবহার করতে পারে Set
যেমন thisArg
এর Array#filter
এবং নিতে Set#has
কলব্যাক হিসাবে।
function intersection(a, b) {
return a.filter(Set.prototype.has, new Set(b));
}
console.log(intersection([1, 2, 3], [2, 3, 4, 5]));
একটি ক্ষুদ্রতম এটিকে এখানে ছোট ফিলাক ( ফিল্টার / সূচিপত্র সমাধান ), একটি জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করে একটি অ্যারেতে মানগুলির একটি সূচক তৈরি করা, এটি ও (এন * এম) থেকে "সম্ভবত" রৈখিক সময়ে হ্রাস করবে। উত্স 1 উত্স 2
function intersect(a, b) {
var aa = {};
a.forEach(function(v) { aa[v]=1; });
return b.filter(function(v) { return v in aa; });
}
এটি খুব সহজ সমাধান নয় (এটি ফিল্টার + ইনডেক্সের চেয়ে বেশি কোড ), না এটি খুব দ্রুততম (সম্ভবত ছেদযুক্ত_সেসে () এর চেয়ে ধ্রুবক ফ্যাক্টর দ্বারা ধীর ) তবে এটি বেশ ভাল ভারসাম্যের মতো বলে মনে হচ্ছে। ভাল পারফরম্যান্স সরবরাহের সময় এটি খুব সাধারণ দিকে রয়েছে এবং এর জন্য প্রাক সাজানো ইনপুটগুলির প্রয়োজন হয় না।
অন্য সূচিকৃত পদ্ধতি একবারে যে কোনও সংখ্যক অ্যারে প্রক্রিয়া করতে সক্ষম:
// Calculate intersection of multiple array or object values.
function intersect (arrList) {
var arrLength = Object.keys(arrList).length;
// (Also accepts regular objects as input)
var index = {};
for (var i in arrList) {
for (var j in arrList[i]) {
var v = arrList[i][j];
if (index[v] === undefined) index[v] = 0;
index[v]++;
};
};
var retv = [];
for (var i in index) {
if (index[i] == arrLength) retv.push(i);
};
return retv;
};
এটি কেবলমাত্র সেই মানগুলির জন্যই কাজ করে যা স্ট্রিং হিসাবে মূল্যায়ন করা যায় এবং আপনার সেগুলি যেমন অ্যারে হিসাবে পাস করা উচিত:
intersect ([arr1, arr2, arr3...]);
... তবে এটি স্বচ্ছভাবে প্যারামিটার হিসাবে বা যে কোনও উপাদানকে ছেদ করার জন্য (সর্বদা সাধারণ মানের অ্যারে ফিরিয়ে দেয়) হিসাবে স্বীকৃতি দেয়। উদাহরণ:
intersect ({foo: [1, 2, 3, 4], bar: {a: 2, j:4}}); // [2, 4]
intersect ([{x: "hello", y: "world"}, ["hello", "user"]]); // ["hello"]
সম্পাদনা: আমি কেবল লক্ষ্য করেছি যে এটি একরকমভাবে কিছুটা বগি।
এটি হ'ল: আমি এটিকে ভেবে কোড করেছিলাম যে ইনপুট অ্যারেগুলিতে নিজেই পুনরাবৃত্তি থাকতে পারে না (প্রদত্ত উদাহরণটি যেমন দেয় না)।
তবে যদি ইনপুট অ্যারেগুলিতে পুনরাবৃত্তি থাকে, তবে এটি ভুল ফলাফল আনবে। উদাহরণ (প্রয়োগের নীচে ব্যবহার করে):
intersect ([[1, 3, 4, 6, 3], [1, 8, 99]]);
// Expected: [ '1' ]
// Actual: [ '1', '3' ]
ভাগ্যক্রমে এটি দ্বিতীয় স্তরের সূচকে যুক্ত করে ঠিক করা সহজ। এটাই:
পরিবর্তন:
if (index[v] === undefined) index[v] = 0;
index[v]++;
দ্বারা:
if (index[v] === undefined) index[v] = {};
index[v][i] = true; // Mark as present in i input.
...এবং:
if (index[i] == arrLength) retv.push(i);
দ্বারা:
if (Object.keys(index[i]).length == arrLength) retv.push(i);
সম্পূর্ণ উদাহরণ:
// Calculate intersection of multiple array or object values.
function intersect (arrList) {
var arrLength = Object.keys(arrList).length;
// (Also accepts regular objects as input)
var index = {};
for (var i in arrList) {
for (var j in arrList[i]) {
var v = arrList[i][j];
if (index[v] === undefined) index[v] = {};
index[v][i] = true; // Mark as present in i input.
};
};
var retv = [];
for (var i in index) {
if (Object.keys(index[i]).length == arrLength) retv.push(i);
};
return retv;
};
intersect ([[1, 3, 4, 6, 3], [1, 8, 99]]); // [ '1' ]
var v =
লাইন যুক্ত হওয়ার পরে if (typeof v == 'function') continue;
এবং এটি ফলাফলগুলিতে যুক্ত ফাংশনগুলি এড়িয়ে যাবে। ধন্যবাদ!
if (typeof v == 'function')
, তবে আমরা এর স্ট্রিংফিকেশন ( v.toString()
) এর সূচকের জন্য কী হিসাবে ব্যবহার করতে পারি But তবে, এটি অক্ষত রাখার জন্য আমাদের কিছু করা দরকার The এটি করার সহজতম উপায়টি হ'ল একটি সাধারণ বুলিয়ান সত্য মানের পরিবর্তে মূল ফাংশনটি অর্পণ করা হয় But তবে, সেক্ষেত্রে সর্বশেষতম ডিনডেক্সটোনকেও এই শর্তটি সনাক্ত করতে এবং সঠিক মান (ফাংশন) পুনরুদ্ধার করতে হবে
আপনি (আই বাদে সমস্ত ব্রাউজারের জন্য) ব্যবহার করতে পারেন:
const intersection = array1.filter(element => array2.includes(element));
বা আইই এর জন্য:
const intersection = array1.filter(element => array2.indexOf(element) !== -1);
আপনার ডেটাতে কিছু সীমাবদ্ধতা সহ, আপনি লিনিয়ার সময়ে এটি করতে পারেন !
জন্য ধনাত্মক পূর্ণসংখ্যা : একটি "দেখা / দেখা যায় না" বুলিয়ান একটি অ্যারের মান ম্যাপিং ব্যবহার করুন।
function intersectIntegers(array1,array2) {
var seen=[],
result=[];
for (var i = 0; i < array1.length; i++) {
seen[array1[i]] = true;
}
for (var i = 0; i < array2.length; i++) {
if ( seen[array2[i]])
result.push(array2[i]);
}
return result;
}
অবজেক্টগুলির জন্য অনুরূপ কৌশল রয়েছে : একটি ডামি কী নিন, অ্যারের 1 এ প্রতিটি উপাদানটির জন্য এটি "সত্য" এ সেট করুন, তারপরে অ্যারে 2 এর উপাদানগুলিতে এই কীটি সন্ধান করুন। আপনার কাজ শেষ হয়ে গেলে পরিষ্কার করুন।
function intersectObjects(array1,array2) {
var result=[];
var key="tmpKey_intersect"
for (var i = 0; i < array1.length; i++) {
array1[i][key] = true;
}
for (var i = 0; i < array2.length; i++) {
if (array2[i][key])
result.push(array2[i]);
}
for (var i = 0; i < array1.length; i++) {
delete array1[i][key];
}
return result;
}
অবশ্যই আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে চাবিটি আগে উপস্থিত হয়নি, অন্যথায় আপনি আপনার ডেটা নষ্ট করবেন ...
আমার পক্ষে সবচেয়ে বেশি যা কাজ করে যাচ্ছে তাতে আমি অবদান রাখব:
if (!Array.prototype.intersect){
Array.prototype.intersect = function (arr1) {
var r = [], o = {}, l = this.length, i, v;
for (i = 0; i < l; i++) {
o[this[i]] = true;
}
l = arr1.length;
for (i = 0; i < l; i++) {
v = arr1[i];
if (v in o) {
r.push(v);
}
}
return r;
};
}
আইই 9.0, ক্রোম, ফায়ারফক্স, অপেরা,
function intersection(a,b){
var rs = [], x = a.length;
while (x--) b.indexOf(a[x])!=-1 && rs.push(a[x]);
return rs.sort();
}
intersection([1,2,3], [2,3,4,5]);
//Result: [2,3]
'use strict'
// Example 1
function intersection(a1, a2) {
return a1.filter(x => a2.indexOf(x) > -1)
}
// Example 2 (prototype function)
Array.prototype.intersection = function(arr) {
return this.filter(x => arr.indexOf(x) > -1)
}
const a1 = [1, 2, 3]
const a2 = [2, 3, 4, 5]
console.log(intersection(a1, a2))
console.log(a1.intersection(a2))
একটি কার্যকরী পদ্ধতির পার্শ্ব প্রতিক্রিয়া ছাড়াই কেবল খাঁটি ফাংশনগুলি ব্যবহার করা বিবেচনা করতে হবে, যার প্রতিটিই কেবল একটি কাজের সাথে সম্পর্কিত।
এই বিধিনিষেধগুলি জড়িত ক্রিয়াকলাপগুলির সামঞ্জস্যতা এবং পুনরায় ব্যবহারযোগ্যতা বাড়ায়।
// small, reusable auxiliary functions
const createSet = xs => new Set(xs);
const filter = f => xs => xs.filter(apply(f));
const apply = f => x => f(x);
// intersection
const intersect = xs => ys => {
const zs = createSet(ys);
return filter(x => zs.has(x)
? true
: false
) (xs);
};
// mock data
const xs = [1,2,2,3,4,5];
const ys = [0,1,2,3,3,3,6,7,8,9];
// run it
console.log( intersect(xs) (ys) );
অনুগ্রহ করে নোট করুন যে নেটিভ Set
টাইপটি ব্যবহৃত হয়, এটির একটি সুবিধাজনক অনুসন্ধানের কর্মক্ষমতা রয়েছে।
স্পষ্টতই প্রথম থেকে বারবার সংঘটিত আইটেমগুলি Array
সংরক্ষণ করা হয়, Array
অন্যটি ডি-সদৃশ। এটি পছন্দসই আচরণ হতে পারে বা নাও হতে পারে। আপনার যদি অনন্য ফলাফলের প্রয়োজন dedupe
হয় তবে প্রথম যুক্তিতে প্রয়োগ করুন :
// auxiliary functions
const apply = f => x => f(x);
const comp = f => g => x => f(g(x));
const afrom = apply(Array.from);
const createSet = xs => new Set(xs);
const filter = f => xs => xs.filter(apply(f));
// intersection
const intersect = xs => ys => {
const zs = createSet(ys);
return filter(x => zs.has(x)
? true
: false
) (xs);
};
// de-duplication
const dedupe = comp(afrom) (createSet);
// mock data
const xs = [1,2,2,3,4,5];
const ys = [0,1,2,3,3,3,6,7,8,9];
// unique result
console.log( intersect(dedupe(xs)) (ys) );
Array
গুলিআপনি একজন ইচ্ছামত সংখ্যা ছেদ গনা করতে চান, Array
গুলি শুধু রচনা intersect
সঙ্গে foldl
। এখানে একটি সুবিধাজনক ফাংশন রয়েছে:
// auxiliary functions
const apply = f => x => f(x);
const uncurry = f => (x, y) => f(x) (y);
const createSet = xs => new Set(xs);
const filter = f => xs => xs.filter(apply(f));
const foldl = f => acc => xs => xs.reduce(uncurry(f), acc);
// intersection
const intersect = xs => ys => {
const zs = createSet(ys);
return filter(x => zs.has(x)
? true
: false
) (xs);
};
// intersection of an arbitrarily number of Arrays
const intersectn = (head, ...tail) => foldl(intersect) (head) (tail);
// mock data
const xs = [1,2,2,3,4,5];
const ys = [0,1,2,3,3,3,6,7,8,9];
const zs = [0,1,2,3,4,5,6];
// run
console.log( intersectn(xs, ys, zs) );
(expr ? true : false)
অতিরিক্ত কাজ। expr
আসল বুলিয়ানগুলির প্রয়োজন না হলে কেবল ব্যবহার করুন , কেবল সত্য / মিথ্যা।
সরলতা জন্য:
// Usage
const intersection = allLists
.reduce(intersect, allValues)
.reduce(removeDuplicates, []);
// Implementation
const intersect = (intersection, list) =>
intersection.filter(item =>
list.some(x => x === item));
const removeDuplicates = (uniques, item) =>
uniques.includes(item) ? uniques : uniques.concat(item);
// Example Data
const somePeople = [bob, doug, jill];
const otherPeople = [sarah, bob, jill];
const morePeople = [jack, jill];
const allPeople = [...somePeople, ...otherPeople, ...morePeople];
const allGroups = [somePeople, otherPeople, morePeople];
// Example Usage
const intersection = allGroups
.reduce(intersect, allPeople)
.reduce(removeDuplicates, []);
intersection; // [jill]
উপকারিতা:
অপূর্ণতা:
আপনি এটি 3 ডি ইঞ্জিন বা কার্নেল কাজের জন্য ব্যবহার করতে চাইবেন না, তবে ইভেন্ট-ভিত্তিক অ্যাপ্লিকেশনটিতে চালানোর জন্য যদি আপনার সমস্যা হয় তবে আপনার ডিজাইনে আরও বড় সমস্যা রয়েছে।
.reduce
একটি মানচিত্র তৈরি .filter
করতে এবং ছেদটি সন্ধান করতে। delete
এর মধ্যে .filter
আমাদের দ্বিতীয় অ্যারেটি আচরণ করার অনুমতি দেয় যদিও এটি একটি অনন্য সেট।
function intersection (a, b) {
var seen = a.reduce(function (h, k) {
h[k] = true;
return h;
}, {});
return b.filter(function (k) {
var exists = seen[k];
delete seen[k];
return exists;
});
}
আমি এই পদ্ধতির সম্পর্কে যুক্তিযুক্ত করা বেশ সহজ। এটি ধ্রুবক সময়ে পারফর্ম করে।
List1.filter (n => list2.includes (n)) ছাড়াও এটি সম্ভবত সবচেয়ে সহজ
var list1 = ['bread', 'ice cream', 'cereals', 'strawberry', 'chocolate']
var list2 = ['bread', 'cherry', 'ice cream', 'oats']
function check_common(list1, list2){
list3 = []
for (let i=0; i<list1.length; i++){
for (let j=0; j<list2.length; j++){
if (list1[i] === list2[j]){
list3.push(list1[i]);
}
}
}
return list3
}
check_common(list1, list2) // ["bread", "ice cream"]
যদি আপনার এটির প্রয়োজন হয় তবে একাধিক অ্যারে ছেদ করে এটি পরিচালনা করতে হবে:
const intersect = (a, b, ...rest) => {
if (rest.length === 0) return [...new Set(a)].filter(x => new Set(b).has(x));
return intersect(a, intersect(b, ...rest));
};
console.log(intersect([1,2,3,4,5], [1,2], [1, 2, 3,4,5], [2, 10, 1])) // [1,2]
ES6 শৈলীর সহজ উপায়।
const intersection = (a, b) => {
const s = new Set(b);
return a.filter(x => s.has(x));
};
উদাহরণ:
intersection([1, 2, 3], [4, 3, 2]); // [2, 3]
আমি একটি আন্তঃসংশোধন ফাংশন লিখেছি যা এমনকি সেই বস্তুর নির্দিষ্ট সম্পত্তির উপর ভিত্তি করে অবজেক্টগুলির অ্যারের ছেদ সনাক্ত করতে পারে।
এই ক্ষেত্রে,
if arr1 = [{id: 10}, {id: 20}]
and arr2 = [{id: 20}, {id: 25}]
এবং আমরা id
সম্পত্তি ভিত্তিতে ছেদ চাই , তারপরে আউটপুটটি হওয়া উচিত:
[{id: 20}]
যেমন, একইটির জন্য ফাংশন (দ্রষ্টব্য: ES6 কোড) হ'ল:
const intersect = (arr1, arr2, accessors = [v => v, v => v]) => {
const [fn1, fn2] = accessors;
const set = new Set(arr2.map(v => fn2(v)));
return arr1.filter(value => set.has(fn1(value)));
};
এবং আপনি ফাংশন হিসাবে কল করতে পারেন:
intersect(arr1, arr2, [elem => elem.id, elem => elem.id])
এছাড়াও দ্রষ্টব্য: এই ক্রিয়াটি প্রথম অ্যারেটিকে প্রাথমিক অ্যারে বিবেচনা করে ছেদটি খুঁজে পেয়েছে এবং এভাবে ছেদ করার ফলাফলটি প্রাথমিক অ্যারের মতো হবে।
ভাবেন এটি ও (অ্যারে 1 + অ্যারে 2) সময় ধরে মানচিত্র ধরে ধরে দ্রুত হবে। ও (1) হ'ল দয়া করে ভুল হলে আমাকে সংশোধন করুন।
const intersection = (a1, a2) => {
let map = new Map();
let result = []
for (let i of a1) {
if (!map.has(i)) map.set(i, true);
}
for (let i of a2) {
if (map.has(i)) result.push(i)
}
return result;
}
এখানে আন্ডারস্কোর.জেএস বাস্তবায়ন রয়েছে:
_.intersection = function(array) {
if (array == null) return [];
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = array.length; i < length; i++) {
var item = array[i];
if (_.contains(result, item)) continue;
for (var j = 1; j < argsLength; j++) {
if (!_.contains(arguments[j], item)) break;
}
if (j === argsLength) result.push(item);
}
return result;
};
সূত্র: http://underscorejs.org/docs/underscore.html#section-62