2016-11-12 16 views
2

私はオブジェクトの配列を持っており、オブジェクトの1つを削除したいと思います。Javascript:配列内のオブジェクトのインデックスを検索し、インデックスを知らず、オブジェクトのみ

[ 
    {"field":"ingredients","gte":"egg","lte":"egg"}, 
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}, 
    {"field":"ingredients","gte":"hvetemel","lte":"hvetemel"} 
] 

削除したいオブジェクトのインデックスがわかりませんが、オブジェクト全体がわかります。すなわち:

{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"} 

私はそれが完全なコンテンツ(すべてのプロパティ)だだけでなく、fieldgteまたはlteによって、オブジェクトのインデックスを見つける必要があります。単純なJavaScriptだけで配列内のオブジェクトのインデックスを見つけるにはどうすればよいですか?

+1

をすべての中で一意である何そこで私は、このES6ソリューションをお勧めしますこれらのオブジェクト? – brk

+1

オブジェクトにはオブジェクト/配列そのもののプロパティがありますか? (ネスト) – trincot

+2

['findIndex'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)! – Bergi

答えて

2

データを繰り返し処理し、同じ内容のキーとすべてのキーの長さを確認できます。

var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }], 
 
    search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    keys = Object.keys(search), 
 
    index = -1; 
 

 
data.some(function (a, i) { 
 
    if (Object.keys(a).length === keys.length && keys.every(function (k) { return a[k] === search[k]; })) { 
 
     index = i; 
 
     return true; 
 
    } 
 
}); 
 

 
console.log(index);

ES6

var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }], 
 
    search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    keys = Object.keys(search), 
 
    index = data.findIndex(a => 
 
     Object.keys(a).length === keys.length && keys.every(k => a[k] === search[k])); 
 

 
console.log(index);

+0

'Array.prototype.some'を繰り返し使用する理由は何ですか? (Array.prototype.forEach'の代わりに) – zerkms

+2

最初に一致したオブジェクトが見つかると、それは繰り返しを終了します。 'forEach'は配列のすべての項目を繰り返します。 –

+1

@ NinaScholzおそらく 'some'を早く終了させたい場合、' if'の中で 'true true'を返すことを意味していました。現在のコードは最後に一致するインデックスを返します。 – Dogbert

2

あなたは、各プロパティ名をかどうかをチェック値、およびプロパティ名をobjectにObject.keys()Array.prototype.findIndex()Array.prototype.every()を使用することができます.lengthは等しい。

let data = [ 
 
    {"field":"ingredients","gte":"egg","lte":"egg"}, 
 
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}, 
 
    {"field":"ingredients","gte":"hvetemel","lte":"hvetemel"} 
 
]; 
 

 
let props = {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}; 
 
let keys = Object.keys(props); 
 
let index = data.findIndex(o => keys.every(key => o[key] === props[key]) 
 
       && Object.keys(o).length === keys.length); 
 

 
console.log(index);

0

あなたが文字列化それによって、あなたの問題

var array = [ 
    {"field":"ingredients","gte":"egg","lte":"egg"}, 
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}, 
    {"field":"ingredients","gte":"hvetemel","lte":"hvetemel"} 
]; 
var searchObject =  
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}; 

var indexOfSearchResult; 

for (var i = 0; i < array.length; i++) { 
    var checkEqualBool = true; 
    for (var key in array[i]) { 
     if(array[i][key]!=searchObject[key]){ 
      checkEqualBool = false; 
      break; 
     } 
    } 
    if(checkEqualBool){ 
     indexOfSearchResult = i; 
     break; 
    } 
} 
0

私はオブジェクトを比較する古い方法を使用するために、このコードを使用することができます。私はあなたの更なるコメントから理解では、この1

var x = [{ 
 
    "field": "ingredients", 
 
    "gte": "egg", 
 
    "lte": "egg" 
 
}, { 
 
    "field": "ingredients", 
 
    "gte": "bakepulver", 
 
    "lte": "bakepulver" 
 
}, { 
 
    "field": "ingredients", 
 
    "gte": "hvetemel", 
 
    "lte": "hvetemel" 
 
}]; 
 
var control = { 
 
    "field": "ingredients", 
 
    "gte": "bakepulver", 
 
    "lte": "bakepulver" 
 
}; 
 

 
function getIndex(arr, key) { 
 
    var got = false, 
 
    result = -1; 
 
    arr.every(function(e, i) { 
 
    if (JSON.stringify(e) === JSON.stringify(key)) { 
 
     console.log('match found'); 
 
     result = i; 
 
     return false; 
 
    } 
 
    return true; 
 
    }) 
 
    return result; 
 
} 
 

 
console.log(getIndex(x, control));

+0

これは、プロパティがオブジェクトで保証されていない同じ順序を持つ場合にのみ機能します。 –

+0

これは主な欠点です。あなたにちょうど同意@ニーナシュコ – RizkiDPrast

1

を確認しようとすると、オブジェクトが3つの与えられたプロパティで構成されてのみ、この特定のケースのためのソリューションを必要としています。あなたは、フルES6をサポートしていない場合は

var data = [ 
 
    { "field": "ingredients", "gte": "egg", "lte": "egg" }, 
 
    { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }]; 
 
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }; 
 

 
var index = data.findIndex(
 
    a => a.field == search.field && a.gte == search.gte && a.lte == search.lte); 
 

 
console.log(index);

var data = [ 
 
    { "field": "ingredients", "gte": "egg", "lte": "egg" }, 
 
    { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }]; 
 
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }; 
 

 
var index = -1; 
 
data.some(function (a, i) { 
 
    if (a.field == search.field && a.gte == search.gte && a.lte == search.lte) 
 
     return index = i, true; 
 
}); 
 
console.log(index);

関連する問題