2017-09-04 70 views
1

有人能告訴我爲什麼每次我想檢查一個鍵是否可用於我的數組中,我得到的結果是false?見下面通過按值檢查數組中是否存在鍵

var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 

 
//var inobject = "name" in obj; // result: false 
 
//var inobject = "test1" in obj; // result: false 
 
//var inobject = "10" in obj; // result: false 
 
var inobject = "value" in obj; 
 

 
$('body').append("<p>"+ inobject + "</p>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+3

你不能在obj'檢查屬性'「名」對一個數組 – RomanPerekhrest

+0

嘛,'obj'是一個數組,儘管它的名字,而數組沒有命名密鑰。這個數組由對象組成,你可以在obj [0]中做''value'來檢查數組中的第一項是否爲對象,它是否具有鍵「值」等。 – adeneo

+1

因爲你試圖找到數組元素的一個鍵。這是行不通的。考慮使用:obj.filter((e)=> {return e.value == 10})。length> 0'如果你正在爲一個值爲10的元素打結。 – Bellian

回答

1

只能搜索數組的鍵或值是這樣的:

var obj = new Array(), 
 
    el1, el2 
 

 
obj.push(el1 = { name: "test1", value: "10" }); 
 
obj.push(el2 ={ name: "test2", value: "40" }); 
 

 
$('body').append("<p>check for key 1: "+ (1 in obj) + "</p>"); 
 
$('body').append("<p>check for element el1: "+ (obj.indexOf(el1) >= 0) + "</p>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

如果您正在尋找符合你必須做一些像其他標準的數組中的元素這樣的:

var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 

 
// direct object access 
 
var inobject = obj.filter((e)=>{ return 'value' in e && e.value == 10}).length > 0; 
 

 
// deconstruct elements for better readability (WARNING: object deconstruction is not supported in all browsers yet!) 
 
var inobject2 = obj.filter(({name, value})=>{ return 'value' !=undefined && value == 10}).length > 0; 
 

 
$('body').append("<p>Search for element with value = 10: "+ inobject + "</p>"); 
 
$('body').append("<p>Search for element with value = 10: "+ inobject2 + "</p>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

3

要檢查我的例子中,如果「價值」的數組中存在,而不是在你的數組的元素。要正確檢查數組元素中是否存在「值」,您需要尋址obj[i]。就像這樣:

var obj = new Array(); 
obj.push({ name: "test1", value: "10" }); 
obj.push({ name: "test2", value: "40" }); 
var inobject = "value" in obj[0]; 
console.log(inobject); 
+0

是的但我不想檢查第一個對象。我想檢查我的對象內的每個名字。 – Rotan075

1

因爲"value" in obj是不是你在數組中檢查一個值的存在的方法,你有對象的數組,這意味着你必須要檢查的數組中的元素不是數組本身存在,你這是怎麼做到這一點:

var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 
var inobject = obj.some((a) => "value" in a); 
 
console.log(inobject); // true, means it's there

如果你想要得到的是有鑰匙「值」,使用的元素:

var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 
obj.push({ name: "test2", AnotherKey: "60" }); 
 
var objects = obj.filter((a) => "value" in a); 
 
console.log(objects); // test1 and test2

+1

.filter(..)。長度在這裏是不必要的。它總是有O(n),而.some(..)只有O(n)最壞的情況。 –

+0

@Jonasw沒錯,謝謝你提醒我。 –

1

的問題是,您要檢查是否存在陣列上的關鍵,而不是在陣列內的對象,從而有望爲它們穿上」這些密鑰不匹配t存在於陣列上。

如果你想檢查數組內的任何物體都有特定的鍵,然後你可以用一個簡單的循環做到這一點:

var found = false; 
var search = "value"; 
for(var i = 0; i < obj.length; i++){ 
    if(search in obj[i]){ 
     found = true; 
     break; 
    } 
} 

或者它分成一個不錯的功能:

function doesKeyExist(var arr, var key){ 
    for(var i = 0; i < obj.length; i++){ 
     if(key in obj[i]) 
      return true; 
    } 
    return false; 
} 

var inobject = doesKeyExist(obj, "value"); 
$('body').append("<p>"+ inobject + "</p>"); 

如果你想找到一個屬性的,你對於

function doesValueExistForKey(var arr, var key, var search){ 
    for(var i = 0; i < obj.length; i++){ 
     if(key in obj[i] && obj[i][key] === search) 
      return true; 
    } 
    return false; 
} 

var inobject = doesValueExistForKey(obj, "name", "test1"); 
$('body').append("<p>"+ inobject + "</p>"); 
0

操作檢查:可以做到這一點。你的陣列具有以下鍵:

0,1 

所以

0 in obj 

是真實的。

1

如果你想找到一個集合中的任何對象的關鍵存在,(第一級),那麼與其做 "value" in obj;你可以做obj.some(e=> "value" in o);

//name is obj but its actually a array 
 
var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 

 

 
function checkForKey(list, key) { 
 
    return list.some(e => key in e); 
 
} 
 

 
console.log('Key [name]:', checkForKey(obj, 'name')); 
 
console.log('Key [age]:', checkForKey(obj, 'age')); 
 
console.log('Key [value]:', checkForKey(obj, 'value'));

如果您正在看任何級別,在一個數組或對象內遞歸,然後試試這個(沒有太多的性能高效但易於操縱)

var obj = new Array(); 
 
obj.push({ name: "test1", value: "10" }); 
 
obj.push({ name: "test2", value: "40" }); 
 

 
function checkForKeyNested(list, key) { 
 
    try { 
 
    JSON.parse(JSON.stringify(list), function(k, v){ 
 
     if(key===k) { 
 
      flag=true; 
 
      throw 0; 
 
     } 
 
     return v; 
 
    }); 
 
    } catch(ex) { return true;} 
 
    return false; 
 
} 
 

 
console.log('Key [name]:', checkForKeyNested(obj, 'name')); 
 
console.log('Key [age]:', checkForKeyNested(obj, 'age')); 
 
console.log('Key [value]:', checkForKeyNested(obj, 'value'));

1

你可以試試這個。

var obj = new Object(); 
obj.name='t1'; 
obj.value='t2'; 

obj.hasOwnProperty('value'); // Return true if exist otherwise false 
+0

你也可以,: 函數查找(名稱){ 爲(VAR I = 0,LEN = arr.length; I

1

in運營商檢查它被稱爲該對象的屬性鍵名稱。您可以將它用於您推入數組中的對象,或者將它用於數組索引。

// a little nano-sized test suite made on the fly :) 
 
const passed = document.getElementById('passed') 
 
const assert = test => { 
 
    if (!test) throw 'invalid assertion' 
 
    passed.innerText = +passed.innerText + 1 
 
} 
 

 
// creates an Object that inherits from Array.prototype 
 
var obj = new Array() 
 

 
// Append an object {name, value} to the array 
 
// 
 
obj.push({ 
 
    name: 'test1', 
 
    value: 10 
 
}) 
 

 
// Add a property to the array-object called value 
 
obj.value = 40 
 

 
assert('name' in obj === false) 
 
assert('value' in obj === true) 
 
assert(0 in obj === true) 
 
assert('name' in obj[0] === true)
<p><span id='passed'>0</span> tests passed</p>

1

您與對象的數組工作。有幾種方法可以做到這一點,但是我們只需創建一個lookup和lookupAll函數並使用它:(它們都返回對象數組),其他的則返回索引和索引數組 - 如果排序則更改。請注意,即使在像IE6這樣非常醜陋的舊版瀏覽器中,它也能正常工作。

// create a namespace for my functions 
 
var myApp = myApp || {}; 
 
myApp.arrayObj = { 
 
    indexOf: function(myArray, searchTerm, property) { 
 
    for (var i = 0; i < myArray.length; i++) { 
 
     if (myArray[i][property] === searchTerm) return i; 
 
    } 
 
    return -1; 
 
    }, 
 
    indexAllOf: function(myArray, searchTerm, property) { 
 
    var ai = []; 
 
    for (var i = 0; i < myArray.length; i++) { 
 
     if (myArray[i][property] === searchTerm) ai.push(i); 
 
    } 
 
    return ai; 
 
    }, 
 
    lookup: function(myArray, searchTerm, property, firstOnly) { 
 
    var found = []; 
 
    var i = myArray.length; 
 
    while (i--) { 
 
     if (myArray[i][property] === searchTerm) { 
 
     found.push(myArray[i]); 
 
     if (firstOnly) break; //if only the first 
 
     } 
 
    } 
 
    return found; 
 
    }, 
 
    lookupAll: function(myArray, property, searchTerm) { 
 
    return this.lookup(myArray, searchTerm, property, false); 
 
    } 
 
}; 
 

 
var myobj = [{ name: "friend", value: "17" }];// better than new Array() 
 
myobj.push({ name: "test1", value: "10" }); 
 
myobj.push({ name: "test2", value: "40" }); 
 
console.log(myobj); 
 
// array of all matches 
 
var allones = myApp.arrayObj.lookupAll(myobj, "test1", "name"); 
 
console.log(allones.length);// 1 
 

 
// returns array of 1 
 
var firstone = myApp.arrayObj.lookup(myobj, "friend", "name",true); 
 
console.log(firstone[0].value);//17