1123

4 つのオブジェクトの配列があるとします。

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

たとえば、ループなし{a: 5, b: 6}でプロパティの値によって3 番目のオブジェクト () を取得する方法はありますか?bfor...in

4

17 に答える 17

1588

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)

于 2012-12-20T02:01:22.363 に答える
415
jsObjects.find(x => x.b === 6)

MDN から:

配列内のfind()要素が提供されたテスト関数を満たす場合、メソッドは配列内の値を返します。それ以外の場合undefinedは返されます。


補足:find()や アロー関数などのメソッドは古いブラウザー (IE など) ではサポートされていないため、これらのブラウザーをサポートしたい場合は、Babelを使用してコードをトランスパイルする必要があります。

于 2016-02-14T20:51:13.230 に答える
189

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;
      }
    }
  }
}
于 2012-12-20T02:58:29.240 に答える
46

Ways to achieve the requirement :

  1. Using Array.find() method :

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);

  1. Using Array.filter() method :

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]);

  1. Using for...in loop :

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]);
  }
}

于 2016-11-02T09:57:55.620 に答える
22

underscore.js の使用:

var foundObject = _.findWhere(jsObjects, {b: 6});
于 2015-10-16T18:15:36.910 に答える
20

ECMAScript 6 の提案には、Arrayメソッドfind()findIndex(). MDN は、すべてのブラウザーでこれらの機能を取得するために含めることができるポリフィルも提供します。

find():

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

findIndex():

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
于 2014-04-04T07:39:54.980 に答える
18

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;
});
于 2012-12-20T02:03:03.060 に答える
11

オブジェクトのプロパティ値によってオブジェクトの配列からオブジェクトを取得するため_.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()

于 2016-12-04T11:37:58.360 に答える
6
var result = jsObjects.filter(x=> x.b === 6);

フィルターで return を使用すると、結果が得られない場合があります (理由はわかりません)。

于 2018-02-09T08:18:14.867 に答える
3

特定のプロパティ値によってオブジェクトの配列から最初のオブジェクトを取得するには:

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>

于 2016-04-27T10:08:42.703 に答える
-31
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;

于 2015-07-23T04:54:33.383 に答える