2016-06-20 2 views
2

개조 : 질문을 의역 할 수 있습니다. 내가하려고하는 것은 지정된 동적 배열 속성에 대한 배열의 모든 값이 같고 이 맞으면이면 반환하십시오.배열의 값을 비교하여 반환하는 JavaScript 함수

내가 underscore.js를 사용하여 3 줄이를 달성하지만, 내가이 기대되었다/간단하게 단축 될 수있다 :

var val = this.children[0]["myProperty"]; 
var same = _.all(this.children, child => child["myProperty"] === val); 

return same ? val : null; 

그래서 경우 :

this.children = [{"myProperty":null},{"myProperty":2},{"myProperty":1},{"myProperty":1}];은 ... null

을 반환

this.children = [{"myProperty":1},{"myProperty":1},{"myProperty":1},{"myProperty":1}]; ... 1

NB "myProperty"의 값은 자바 스크립트 바닐라와 reduce를 사용하여이 작업을 보인다 한 자리 정수 또는 null

+0

당신은 대신'.myProperty'를 사용하여 몇 가지 문자를 면도 있었다'[ "myProperty"]','myProperty' 변수의 값이 아닌 경우. –

+0

예, 동적 속성입니다. 나는'all'과'filter' 함수의 일종의 조합을 원했습니다 - 하나의 라이너 – Tsar

답변

1

:

var prop = "myProperty"; 

//vanilla JS 
return this.children.map(o => o[prop]).reduce((acc, v) => acc === v? v: null); 

//and underscore 
return _.reduce(_.pluck(this.children, prop), (acc, v) => acc === v? v: null); 
+0

매우 좋았습니다! 어느 것을 골라야합니까? =) – Tsar

+0

그들은 기본적으로 동일하지 않습니다 상관 없어. 이미 밑줄을 사용하는 경우 일관성을 유지하십시오. 그렇지 않으면이 문제를 해결하기 위해 포함 할 필요가 없습니다. – Thomas

1

, 또는 어쩌면 올바른 방향으로 밀어 것

function children(arr,prop){ 
    return arr.reduce(
    function(prevVal,curVal){ 
     return prevVal == curVal[prop] ? prevVal : null 
    }, 
    arr[0][prop] 
); 
} 

children([{"myProperty":null},{"myProperty":2},{"myProperty":1},{"myProperty":1}],'myProperty') 
> null 
children([{"myProperty":1},{"myProperty":1},{"myProperty":1},{"myProperty":1}],'myProperty') 
> 1 

또는 동적 속성

Array.prototype.children = function(prop){ 
    return this.reduce(
    function(prevVal,curVal){ 
     return prevVal == curVal[prop] ? prevVal : null 
    }, 
    this[0][prop] 
); 
} 

[{"myProperty":null},{"myProperty":2},{"myProperty":1},{"myProperty":1}].children('myProperty') 
> null 
[{"myProperty":1},{"myProperty":1},{"myProperty":1},{"myProperty":1}].children('myProperty') 
> 1 
0

자신의 솔루션은 가능한 한 부정적인 결과를 반환합니다. 여전히 O (n)이지만, children이 크고 값이 거의 동일하지 않은 경우 차이가 감지 될 수 있습니다 (거의 절대로). 바닐라 JS에서 .every를 사용하여 :

function childrenValue(prop) { 
    var first = this.children[0][prop]; 

    return this.children.every(child => child[prop] === first) ? first : null; 
} 
관련 문제