অবজেক্টের বৈশিষ্ট্যগুলির মধ্যে ন্যূনতম / সর্বাধিক মান পেতে দ্রুত উপায়


94

জাভাস্ক্রিপ্টে আমার এর মতো একটি বিষয় রয়েছে:

{ "a":4, "b":0.5 , "c":0.35, "d":5 }

সমস্ত কিছুর মধ্য দিয়ে লুপ না করে সম্পত্তিগুলির মধ্যে ন্যূনতম এবং সর্বাধিক মান পাওয়ার কোনও দ্রুত উপায় আছে? কারণ আমার কাছে থাকা অবজেক্টটি বিশাল এবং আমার প্রতি দুই সেকেন্ডে ন্যূনতম / সর্বাধিক মান পাওয়া দরকার। (বস্তুর মান পরিবর্তন হতে থাকে)।


4
@ ওলেগ: ঠিক আছে, কেবল এটিই দেওয়া হয়েছে, এটি খুব ভাল জেএসএন হতে পারে। ইউসুফ: কোনও বস্তুতে জেএসনকে পার্স করুন এবং এর বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করুন।
ফেলিক্স ক্লিং

@ ওলেগভি.ভলকভ আমি জেএসওএন. পার্স ব্যবহার করছি () এটি কী জসন হওয়া উচিত নয়?
ইউসুফ

@ ইউসেফ পার্স করার আগে এটি জেএসএন (যা একটি স্ট্রিং মান)। পার্স করার পরে এটি একটি অবজেক্টের মান।
Vidime বিদাস

4
জেএসএন হ'ল বস্তুর স্ট্রিং নোটেশন। আপনি যখন কোনও
জিনিসে

4
আমি আপনার প্রশ্নে জেএসএন -> অবজেক্ট স্থির করার স্বাধীনতা নিয়েছি, কারণ মন্তব্যগুলি নিশ্চিত করে যে এটি আপনি কী বোঝাতে চেয়েছিলেন।
ওলেগ ভি। ভলকভ

উত্তর:


19

সমস্ত এন উপাদানগুলিকে (যদি আপনি 1, এন -1 থেকে যান তবে সাধারণ এনকামে সর্বাধিক / ন্যূনতম সন্ধানের কোনও উপায় নেই) আপনি কীভাবে জানতে পারবেন যে উপাদান এন এর চেয়ে বড় (বা ছোট) নয় বর্তমান সর্বাধিক / মিনিট)?

আপনি উল্লেখ করেছেন যে মানগুলি প্রতি কয়েক সেকেন্ডে পরিবর্তিত হয়। কোন মানগুলি পরিবর্তিত হয় তা যদি আপনি সঠিকভাবে জানেন তবে আপনি আপনার পূর্বের সর্বোচ্চ / মিনিট মানগুলির সাথে শুরু করতে পারেন এবং কেবলমাত্র নতুনগুলির সাথে তুলনা করতে পারেন, তবে এই ক্ষেত্রেও যে মানগুলি পরিবর্তিত হয়েছিল সেগুলির মধ্যে যদি কোনও একটি আপনার পুরানো সর্বাধিক / মিনিট হয় তবে আপনি তাদের মাধ্যমে আবার লুপ করা দরকার।

আরেকটি বিকল্প - আবার, কেবল পরিবর্তিত মানগুলির সংখ্যা যদি ছোট হয় - তবে গাছ বা একটি গাদা হিসাবে কাঠামোতে মানগুলি সংরক্ষণ করা হবে এবং নতুন মানগুলি আসার সাথে সাথে আপনি সেগুলি যথাযথভাবে সন্নিবেশ করিয়েছেন (বা আপডেট করবেন)। তবে আপনি এটি করতে পারবেন কিনা তা আপনার প্রশ্নের ভিত্তিতে পরিষ্কার নয়।

আপনি যদি সমস্ত উপাদানের মধ্য দিয়ে লুপিংয়ের সময় কোনও প্রদত্ত তালিকার সর্বাধিক / ন্যূনতম উপাদান পেতে চান, তবে আপনি নীচের স্নিপেটের মতো কিছু ব্যবহার করতে পারেন, তবে আপনি সেগুলি সমস্ত কিছু না করেই তা করতে সক্ষম হবেন না

var list = { "a":4, "b":0.5 , "c":0.35, "d":5 };
var keys = Object.keys(list);
var min = list[keys[0]]; // ignoring case of empty list for conciseness
var max = list[keys[0]];
var i;

for (i = 1; i < keys.length; i++) {
    var value = list[keys[i]];
    if (value < min) min = value;
    if (value > max) max = value;
}

4
এটি কোনও সামগ্রীর বৈশিষ্ট্যগুলির ন্যূনতম / সর্বাধিক মানগুলি কীভাবে পাবেন তা বর্ণনা করে না।
FistOfFury

আপনি কোনও বস্তুর উপর পুনরাবৃত্তি করছেন, কোনও তালিকা নয়। minএবং maxundefined করছে। আপনি কি for inপরিবর্তে একটি লুপ ব্যবহার করতে চাইছেন ?
টোনিক্স

4
ধন্যবাদ @ টোনিক্স, এটি ঠিক করে দিয়েছেন।
কার্লোসফিগুইরা

139

আপডেট: আধুনিক সংস্করণ (ES6 +)

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };

let arr = Object.values(obj);
let min = Math.min(...arr);
let max = Math.max(...arr);

console.log( `Min value: ${min}, max value: ${max}` );


আসল উত্তর:

এটা চেষ্টা কর:

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
var arr = Object.keys( obj ).map(function ( key ) { return obj[key]; });

এবং তারপর:

var min = Math.min.apply( null, arr );
var max = Math.max.apply( null, arr );

লাইভ ডেমো: http://jsfiddle.net/7GCu7/1/


21
এছাড়াও করতে পারেনmax = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
লেবি

4
এটি এখনই করতে পারেন: Math.max(...arr);
cmac

4
@cmac আমি একটি ES6 সংস্করণ যুক্ত করেছি।
Vidime Vidas

@ আইমেভিডাস - ম্যাথ.মিন এবং সর্বাধিক ফাংশনের 3 টি বিন্দু কী উপস্থাপন করে? ধন্যবাদ
এএমই


12

minএবং maxযাইহোক যাইহোক ইনপুট অ্যারেটি লুপ করতে হবে - তারা কীভাবে সবচেয়ে বড় বা ক্ষুদ্রতম উপাদানটি আবিষ্কার করবে?

সুতরাং কেবলমাত্র একটি দ্রুত for..inলুপটি ঠিক কাজ করবে।

var min = Infinity, max = -Infinity, x;
for( x in input) {
    if( input[x] < min) min = input[x];
    if( input[x] > max) max = input[x];
}

4
এটি আই 7/8 এর জন্য দুর্দান্ত। চিয়ার্স @ নিট দ্য ডার্ক
অ্যাবসোল

এটি প্রয়োজনীয়ভাবে সত্য নয় যে অ্যারে থেকে সর্বনিম্ন এবং সর্বোচ্চ লুপটি তাদের মানগুলি পেতে পারে। এটা আরো সম্ভবপর যে তারা অ্যারে নির্বাচন মিনিট এবং যে ফলের উপর ভিত্তি করে সর্বোচ্চ মান quicksort এর
goonerify

7
@ জেনারাইফাই দ্রুততম ধরণটি হ'ল O(n log n), যা O(n)একবারে স্ক্যানিংয়ের চেয়ে সহজাতভাবে ধীর হয় ...
নিট দ্য ডার্ক অ্যাবসোল

11

আপনি চেষ্টা করতে পারেন:

const obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
const max = Math.max.apply(null, Object.values(obj));
console.log(max) // 5

5
// 1. iterate through object values and get them
// 2. sort that array of values ascending or descending and take first, 
//    which is min or max accordingly
let obj = { 'a': 4, 'b': 0.5, 'c': 0.35, 'd': 5 }
let min = Object.values(obj).sort((prev, next) => prev - next)[0] // 0.35
let max = Object.values(obj).sort((prev, next) => next - prev)[0] // 5

4
ব্যাখ্যা যুক্ত হয়েছে।
আন্দ্রে কুদরিয়াভসেভ



3

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

অতিরিক্তভাবে, এটি বাছাই করা অবজেক্টটি প্রদান করে যা বিদ্যমান অবজেক্টটিকে প্রতিস্থাপন করতে পারে যাতে ভবিষ্যতের ধরণগুলি দ্রুততর হয় কারণ এটি ইতিমধ্যে অর্ধ-সাজানো = ও (এন) এর চেয়ে ভাল। এটি লক্ষ্য করা গুরুত্বপূর্ণ যে বিষয়গুলি ES6 এ তাদের অর্ডার বজায় রাখে।

const maxMinVal = (obj) => {
  const sortedEntriesByVal = Object.entries(obj).sort(([, v1], [, v2]) => v1 - v2);

  return {
    min: sortedEntriesByVal[0],
    max: sortedEntriesByVal[sortedEntriesByVal.length - 1],
    sortedObjByVal: sortedEntriesByVal.reduce((r, [k, v]) => ({ ...r, [k]: v }), {}),
  };
};

const obj = {
  a: 4, b: 0.5, c: 0.35, d: 5
};

console.log(maxMinVal(obj));


ধন্যবাদ! আমি মানটি নিয়ে যাওয়ার কীটি ধরে রাখার পরে কীভাবে সর্বোচ্চ পেতে হবে তা নির্ধারণ করার চেষ্টা করছিলাম। এই সাহায্য! :)
010011100101

2

বিভিন্ন গভীরতার নেস্টেড স্ট্রাকচারগুলির জন্য, যেমন {node: {leaf: 4}, leaf: 1}এটি কাজ করবে (লোটাস বা আন্ডারস্কোর ব্যবহার করে):

function getMaxValue(d){
    if(typeof d === "number") {
        return d;
    } else if(typeof d === "object") {
        return _.max(_.map(_.keys(d), function(key) {
            return getMaxValue(d[key]);
        }));
    } else {
        return false;
    }
}

2
var newObj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
var maxValue = Math.max(...Object.values(newObj))
var minValue = Math.min(...Object.values(newObj))

4
কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময়, অন্য উত্তর স্ট্যাকওভারফ্লো ব্যবহারকারীদের কাছে আপনার উত্তরটি আরও কার্যকর হবে যদি আপনি নিজের উত্তর কীভাবে সহায়তা করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ অন্তর্ভুক্ত করে, বিশেষত ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন একটি প্রশ্নের জন্য। দেখুন: আমি কীভাবে ভাল উত্তর লিখব
ডেভিড বাক

0

এটি আমার পক্ষে কাজ করে:

var object = { a: 4, b: 0.5 , c: 0.35, d: 5 };
// Take all value from the object into list
var valueList = $.map(object,function(v){
     return v;
});
var max = valueList.reduce(function(a, b) { return Math.max(a, b); });
var min = valueList.reduce(function(a, b) { return Math.min(a, b); });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.