4 つのオブジェクトの配列があるとします。
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
たとえば、ループなし{a: 5, b: 6}
でプロパティの値によって3 番目のオブジェクト () を取得する方法はありますか?b
for...in
4 つのオブジェクトの配列があるとします。
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
たとえば、ループなし{a: 5, b: 6}
でプロパティの値によって3 番目のオブジェクト () を取得する方法はありますか?b
for...in
Filter
プロパティが値と一致するオブジェクトの配列は、配列を返します。
var result = jsObjects.filter(obj => {
return obj.b === 6
})
Array.prototype.filter()の MDN ドキュメントを参照してください。
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.filter(obj => {
return obj.b === 6
})
console.log(result)
Find
配列内の最初の要素/オブジェクトの値、それ以外の場合undefined
は返されます。
var result = jsObjects.find(obj => {
return obj.b === 6
})
Array.prototype.find()の MDN ドキュメントを参照してください。
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.find(obj => {
return obj.b === 6
})
console.log(result)
for ループに反対している理由がわかりません (おそらくfor loop
、特に ではなくを意味していたのでしょうfor..in
)。それらは高速で読みやすいです。とにかく、ここにいくつかのオプションがあります。
ループの場合:
function getByValue(arr, value) {
for (var i=0, iLen=arr.length; i<iLen; i++) {
if (arr[i].b == value) return arr[i];
}
}
。フィルター
function getByValue2(arr, value) {
var result = arr.filter(function(o){return o.b == value;} );
return result? result[0] : null; // or undefined
}
.forEach
function getByValue3(arr, value) {
var result = [];
arr.forEach(function(o){if (o.b == value) result.push(o);} );
return result? result[0] : null; // or undefined
}
一方、本当に for..in を意味していて、値が 6 のプロパティを持つオブジェクトを見つけたい場合は、チェックする名前を渡さない限り、for..in を使用する必要があります。
例
function getByValue4(arr, value) {
var o;
for (var i=0, iLen=arr.length; i<iLen; i++) {
o = arr[i];
for (var p in o) {
if (o.hasOwnProperty(p) && o[p] == value) {
return o;
}
}
}
}
Ways to achieve the requirement :
const jsObject = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
const filteredResult = jsObject.find((e) => e.b == 6);
console.log(filteredResult);
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
const filterObj = jsObjects.filter((e) => e.b == 6);
console.log(filterObj[0]);
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
for (const i in jsObjects) {
if (jsObjects[i].b == 6) {
console.log(jsObjects[i]);
}
}
underscore.js の使用:
var foundObject = _.findWhere(jsObjects, {b: 6});
ECMAScript 6 の提案には、Array
メソッドfind()
とfindIndex()
. MDN は、すべてのブラウザーでこれらの機能を取得するために含めることができるポリフィルも提供します。
function isPrime(element, index, array) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) return false;
}
return (element > 1);
}
console.log( [4, 6, 8, 12].find(isPrime) ); // undefined, not found
console.log( [4, 5, 8, 12].find(isPrime) ); // 5
function isPrime(element, index, array) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) return false;
}
return (element > 1);
}
console.log( [4, 6, 8, 12].findIndex(isPrime) ); // -1, not found
console.log( [4, 6, 7, 12].findIndex(isPrime) ); // 2
b
私の理解が正しければ、プロパティが6
?である配列内のオブジェクトを見つけたいと考えています。
var found;
jsObjects.some(function (obj) {
if (obj.b === 6) {
found = obj;
return true;
}
});
または、アンダースコアを使用していた場合:
var found = _.select(jsObjects, function (obj) {
return obj.b === 6;
});
オブジェクトのプロパティ値によってオブジェクトの配列からオブジェクトを取得するため_.find(collection, [predicate=_.identity], [fromIndex=0])
にlo-dashを使用するのはどうですか。次のようなことができます。
var o = _.find(jsObjects, {'b': 6});
引数:
collection (Array|Object): The collection to inspect.
[predicate=_.identity] (Function): The function invoked per iteration.
[fromIndex=0] (number): The index to search from.
戻り値
(*): Returns the matched element (in your case, {a: 5, b: 6}), else undefined.
パフォーマンスに関しては_.find()
、プロパティを持つ最初のオブジェクトのみをプルするため、の方が高速ですが{'b': 6}
、配列に一致するプロパティ セット (キー:値) を持つ複数のオブジェクトが含まれている場合は、_.filter()
メソッドの使用を検討する必要があります。したがって、あなたの場合、配列にはこのプロパティを持つ単一のオブジェクトがあるため、を使用します_.find()
。
var result = jsObjects.filter(x=> x.b === 6);
フィルターで return を使用すると、結果が得られない場合があります (理由はわかりません)。
特定のプロパティ値によってオブジェクトの配列から最初のオブジェクトを取得するには:
function getObjectFromObjectsArrayByPropertyValue(objectsArray, propertyName, propertyValue) {
return objectsArray.find(function (objectsArrayElement) {
return objectsArrayElement[propertyName] == propertyValue;
});
}
function findObject () {
var arrayOfObjectsString = document.getElementById("arrayOfObjects").value,
arrayOfObjects,
propertyName = document.getElementById("propertyName").value,
propertyValue = document.getElementById("propertyValue").value,
preview = document.getElementById("preview"),
searchingObject;
arrayOfObjects = JSON.parse(arrayOfObjectsString);
console.debug(arrayOfObjects);
if(arrayOfObjects && propertyName && propertyValue) {
searchingObject = getObjectFromObjectsArrayByPropertyValue(arrayOfObjects, propertyName, propertyValue);
if(searchingObject) {
preview.innerHTML = JSON.stringify(searchingObject, false, 2);
} else {
preview.innerHTML = "there is no object with property " + propertyName + " = " + propertyValue + " in your array of objects";
}
}
}
pre {
padding: 5px;
border-radius: 4px;
background: #f3f2f2;
}
textarea, button {
width: 100%
}
<fieldset>
<legend>Input Data:</legend>
<label>Put here your array of objects</label>
<textarea rows="7" id="arrayOfObjects">
[
{"a": 1, "b": 2},
{"a": 3, "b": 4},
{"a": 5, "b": 6},
{"a": 7, "b": 8, "c": 157}
]
</textarea>
<hr>
<label>property name: </label> <input type="text" id="propertyName" value="b"/>
<label>property value: </label> <input type="text" id="propertyValue" value=6 />
</fieldset>
<hr>
<button onclick="findObject()">find object in array!</button>
<hr>
<fieldset>
<legend>Searching Result:</legend>
<pre id="preview">click find</pre>
</fieldset>
var jsObjects = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8}];
3 番目のオブジェクトにアクセスするには、次を使用jsObjects[2];
します。3 番目のオブジェクト b 値にアクセスするには、次を使用します。jsObjects[2].b;