2016-06-20 7 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に」の値は、JavaScriptのバニラと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; 
} 
関連する問題