객체의 속성 중 최소 / 최대 값을 얻는 빠른 방법
다음과 같은 자바 스크립트에 개체가 있습니다.
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
속성을 모두 반복하지 않고도 속성 중 최소 및 최대 값을 얻을 수있는 빠른 방법이 있습니까? 내가 가진 물체가 거대하기 때문에 2 초마다 최소 / 최대 값을 얻어야합니다. (객체의 값은 계속 변경됩니다).
모든 n 요소 를 반복하지 않고 일반적인 경우 최대 / 최소를 찾을 수있는 방법은 없습니다 (1에서 n-1로 이동하는 경우 요소 n 이 해당 요소 보다 크지 않거나 작지 않은지 어떻게 알 수 있습니까? 현재 최대 / 최소)?
값이 몇 초마다 변경된다고 말씀하셨습니다. 어떤 값이 변경되는지 정확히 알고 있다면 이전의 최대 / 최소 값으로 시작하여 새 값과 만 비교할 수 있지만이 경우에도 수정 된 값 중 하나가 이전 최대 / 최소 인 경우 다시 반복해야합니다.
또 다른 대안은-변경되는 값의 수가 적은 경우에만-값을 트리 또는 힙과 같은 구조에 저장하고 새 값이 도착하면 적절하게 삽입 (또는 업데이트)하는 것입니다. 그러나 그렇게 할 수 있는지 여부는 질문에 근거하여 명확하지 않습니다.
이 시도:
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/
업데이트 : 최신 버전 (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}` );
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];
}
시도해 볼 수 있습니다.
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
// 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
lodash 라이브러리 를 사용하면 더 짧게 작성할 수 있습니다.
_({ "a":4, "b":0.5 , "c":0.35, "d":5 }).values().max();
깊이가 다른 중첩 구조의 경우, 즉 {node: {leaf: 4}, leaf: 1}
, 이것은 작동합니다 (lodash 또는 밑줄 사용).
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;
}
}
여기에 키도 반환 할 수 있고 하나의 루프 만 수행하는 솔루션이 있습니다. Object의 항목을 (val 기준) 정렬 한 다음 첫 번째 항목과 마지막 항목을 반환합니다.
또한 기존 Object를 대체 할 수있는 정렬 된 Object를 반환하여 이미 반 정렬 = O (n)보다 낫기 때문에 향후 정렬이 더 빨라질 것입니다. 객체는 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));
이것은 나를 위해 작동합니다.
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); });
You can also try with Object.values
const points = { Neel: 100, Veer: 89, Shubham: 78, Vikash: 67 };
const vals = Object.values(points);
const max = Math.max(...vals);
const min = Math.min(...vals);
console.log(max);
console.log(min);
'developer tip' 카테고리의 다른 글
"rep; (0) | 2020.10.15 |
---|---|
RESTful API 런타임 검색 기능 / HATEOAS 클라이언트 디자인 (0) | 2020.10.15 |
일괄 적으로 base64 디코딩 (0) | 2020.10.14 |
클래스 확장 React.Component는 React에서 getInitialState를 사용할 수 없습니다. (0) | 2020.10.14 |
jQuery UI 대화 상자에서 '제목'을 업데이트하는 방법은 무엇입니까? (0) | 2020.10.14 |