2012-02-07 19 views

Odpowiedz

7

Skoro masz tablicę wypełniona obiektów, trzeba to zrobić jak:

(ES3)

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

if(!lookup('key1')) { 
    arr.push({ 
     key: 'key1', 
     value: 'z' 
    }); 
} 
18

Aby ułatwić należy przechowywać swoje dane wygląda następująco:

var map = { 
     "key1": "z", 
     "key2": "u" 
}; 

Następnie można zrobić czek i jeśli klawisze nie kolidowały z istniejących właściwości na obiekt i don” t potrzebujesz wartości null, które możesz ułatwić.

if (!map["key1"]) { 
    map["key1"] = "z"; 
} 

Jeśli naprawdę potrzebujesz pełnego obiektu (twoje jest przecież tylko przykład), chciałbym przechowywać obiekt jako wartość klucza, a nie tylko przechowywać obiekty w tablicy. Oznacza to, że jest to mapa, a nie tablica.

1
var key; 
for(var i = 0; i < arr.length; i++) 
{ 
    if(arr[i].key == "key1") 
    { 
     key = arr[i]; 
     break; 
    } 
} 
if(typeof (key)=='undefined') //for if the value is 0 as int 
{ 
    key = { 
     key: "key1", value: "aaa" 
    }; 
    arr.push(key); 
} 
5

można użyć ECMAScript 5 filter sposób, aby usunąć elementy z tablicy, jeśli nie zdadzą testu. Jeśli uzyskany tablica ma żadnych elementów, wiesz, że nie było żadnej z wartości:

if(!arr.filter(function(elem) { 
    return elem.key === "key1"; 
}).length) { 
    arr.push({ key: "key1", value: "z" }); 
} 

jeśli chcesz go do pracy w starszych przeglądarkach trzeba by użyć podkładkę aby upewnić Array.prototype.filter jest zdefiniowana.

1

Można sprawdzić zarówno tablice, jak i obiekty, aby sprawdzić, czy istnieje klucz tablicy lub właściwość obiektu, czy nie. Jest to bardzo przydatne i jest używane w taki sam sposób do sprawdzania obu typów.

/** 
* Check if an array key or object property exists 
* @key - what value to check for 
* @search - an array or object to check in 
*/ 
function key_exists(key, search) { 
    if (!search || (search.constructor !== Array && search.constructor !== Object)) { 
     return false; 
    } 
    for (var i = 0; i < search.length; i++) { 
     if (search[i] === key) { 
      return true; 
     } 
    } 
    return key in search; 
} 

Zastosowanie:

jako tablica

key_exists('jared', ['jared', 'williams']); //= true 

jako obiekt

key_exists('jared', {'jared': 'williams'}); //= true 
0

Poniżej są dwa, bardziej wyraźne, versi ons of @ jAndy's przyjęła odpowiedź.

zrobiłem pierwszą wersję dla siebie, więc mogłem zrozumieć logikę lepiej i dodaje następujące:

jeśli klucz nie istnieje, przyrost właściwość rachubę dopasowane obiektu, w przeciwnym razie utwórz nowy obiekt o liczbie równej 1.

W drugiej wersji, zdałem sobie sprawę, wolałbym moje zmiennej arrayOfObjects być object, tak że później mogę konkretnie wartości docelowych zamiast zapętlenie nad tablicy aż mam mecz, a następnie otrzymanie releva nt wartość obiektu.Ta wersja używa obiektu zamiast tablicy obiektów.

Wersja 01 - Tablica obiektów

// based on: https://stackoverflow.com/a/9177103/1063287 
 

 
// the original array of objects 
 
var arrayofObjects = [{ 
 
    id: "CY01", 
 
    count: 1 
 
    }, 
 
    { 
 
    id: "CY33", 
 
    count: 5 
 
    }, 
 
    { 
 
    id: "CY55", 
 
    count: 8 
 
    } 
 
]; 
 

 
// show the array in the interface 
 
$(".before").text(JSON.stringify(arrayofObjects)); 
 

 
// define lookup function (must have access to arrayofObjects) 
 
function lookup(key_to_check) { 
 
    // for each object in the array of objects 
 
    for (var i = 0; i < arrayofObjects.length; i++) { 
 
    // if the object key matches the key to check 
 
    if (arrayofObjects[i]["id"] === key_to_check) { 
 
     // return true with index of matching object 
 
     var returnObject = {}; 
 
     returnObject["exists"] = true; 
 
     returnObject["index"] = i; 
 
     return returnObject; 
 
    } 
 
    } 
 
    // if the above loop has not already returned a value 
 
    // return false 
 
    var returnObject = {}; 
 
    returnObject["exists"] = false; 
 
    return returnObject; 
 
} 
 

 
// on click, check whether the key exists 
 
$(document).on("click", ".run", function() { 
 

 
    var key_to_check = $(".key_to_check").val(); 
 

 
    $(".checking").text(key_to_check); 
 

 
    var returnObject = lookup(key_to_check); 
 

 
    // if key to check doesn't exist add it 
 
    if (returnObject["exists"] === false) { 
 
    console.log("key doesn't exist, adding object"); 
 
    arrayofObjects.push({ 
 
     id: key_to_check, 
 
     count: 1 
 
    }); 
 
    } else if (returnObject["exists"] === true) { 
 
    // else if it does exists, increment the relevant counter 
 
    console.log("key does exist, incrementing object count value"); 
 
    var index = returnObject.index; 
 
    arrayofObjects[index].count += 1; 
 
    } 
 

 
    $(".after").text(JSON.stringify(arrayofObjects)); 
 
});
body { 
 
    font-family: arial; 
 
    font-size: 14px 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p>enter an existing or non-existing key and click run.</p> 
 
<p>if existing, increment count, otherwise create new object with count of 1.</p> 
 

 
<input class="key_to_check"><button class="run">run</button> 
 

 
<br><br> 
 
<div>array of objects - before: <span class="before"></span> </div> 
 

 
<div>checking:<span class="checking"></span></div> 
 

 
<div>array of objects - after: <span class="after"></span></div>

Wersja 02 - Obiekt

// based on: https://stackoverflow.com/a/9177103/1063287 
 

 
// the original object 
 
var myObject = { 
 
    "CY01": 1, 
 
    "CY33": 5, 
 
    "CY55": 8 
 
}; 
 

 
// show the object in the interface 
 
$(".before").text(JSON.stringify(myObject)); 
 

 
// define lookup function (must have access to myObject) 
 
function lookup(key_to_check) { 
 
    // for each property in the object 
 
    for (key in myObject) { 
 
    // if the key matches the key to check 
 
    if (key === key_to_check) { 
 
     // return true 
 
     return true 
 
    } 
 
    } 
 
    // if the above loop has not already returned a value 
 
    // return false 
 
    return false 
 
} 
 

 
// on click, check whether the key exists 
 
$(document).on("click", ".run", function() { 
 

 
    var key_to_check = $(".key_to_check").val(); 
 

 
    $(".checking").text(key_to_check); 
 

 
    var returnObject = lookup(key_to_check); 
 

 
    // if key to check doesn't exist add it 
 
    if (returnObject === false) { 
 
    console.log("key doesn't exist, adding object"); 
 
    myObject[key_to_check] = 1; 
 
    } else if (returnObject === true) { 
 
    // else if it does exists, increment the relevant counter 
 
    console.log("key does exist, incrementing object count value"); 
 
    myObject[key_to_check] += 1; 
 
    } 
 

 
    $(".after").text(JSON.stringify(myObject)); 
 
});
body { 
 
    font-family: arial; 
 
    font-size: 14px 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p>enter an existing or non-existing key and click run.</p> 
 
<p>if existing, increment count, otherwise create new property with count of 1.</p> 
 

 
<input class="key_to_check"><button class="run">run</button> 
 

 
<br><br> 
 
<div>my object - before: <span class="before"></span> </div> 
 

 
<div>checking:<span class="checking"></span></div> 
 

 
<div>my object - after: <span class="after"></span></div>

Powiązane problemy