2015-04-06 15 views
7

próbuję dostać się stąd:Get tablicę wartości nieruchomości z tablicą obiektów z jQuery

example = [{ 
    name: "someone1", 
    city: "somewhere1", 
    state: "someplace1" 
},{ 
    name: "someone2", 
    city: "somewhere2", 
    state: "someplace2" 
}] 

tutaj:

example.name = [ "someone1", "someone2" ] 

w zaledwie kodu, jak to możliwe. Oczywiście mogłem po prostu zapętlić i zbudować tablicę, ale muszę to zrobić wiele razy na różnych obiektach. Mógłbym napisać funkcję, żeby to zrobić, ale byłoby ciężko, aby funkcja była wystarczająco ogólna dla mojej aplikacji.

Czy istnieje skrót do tego w jQuery?

+0

Musisz użyć pętli jquery. Mam nadzieję, że to ci pomoże. http://stackoverflow.com/questions/2342371/jquery-loop-on-json-data-using-each – Deep

+1

Natywny javascript zawsze będzie szybszy niż jQuery. – m0meni

+0

wyjaśnić nieco więcej .. masz jeden obiekt, to jest tablica z tych samych obiektów, a następnie ..? – Legends

Odpowiedz

7

Można iterację kluczy obiektowych i zapisać name w tablicy za pomocą push:

example = [{ 
 
    name: "someone1", 
 
    city: "somewhere1", 
 
    state: "someplace1" 
 
}, { 
 
    name: "someone2", 
 
    city: "somewhere2", 
 
    state: "someplace2" 
 
}]; 
 
var arrNames = []; 
 
//iterate through object keys 
 
Object.keys(example).forEach(function(key) { 
 
    //get the value of name 
 
    var val = example[key]["name"]; 
 
    //push the name string in the array 
 
    arrNames.push(val); 
 
}); 
 
console.log(arrNames);//prints ["someone1", "someone2"]

Po @Felix sugestia (z którymi się zgadzam), nie ma potrzeby korzystania Object.keys:

example = [{ 
 
    name: "someone1", 
 
    city: "somewhere1", 
 
    state: "someplace1" 
 
}, { 
 
    name: "someone2", 
 
    city: "somewhere2", 
 
    state: "someplace2" 
 
}]; 
 
var arrNames = []; 
 
//iterate through object keys 
 
example.forEach(function(item) { 
 
    //get the value of name 
 
    var val = item.name 
 
    //push the name string in the array 
 
    arrNames.push(val); 
 
}); 
 
console.log(arrNames); //prints ["someone1", "someone2"]

Referencje

Object.keys()

Array.prototype.forEach()

Array.prototype.push()

+2

Po prostu wykonałem ogólną funkcję, biorąc nazwę obiektu i nazwy klawiszy i działa bezbłędnie. Świetna odpowiedź, dziękuję! – awimley

+1

Cieszę się, że ci pomogłem. –

+0

'Object.keys (przykład) .forEach (function (key) {' jest bardzo dziwnym sposobem na iterację w tablicy, dlaczego nie po prostu 'example.forEach (function (item) {...})'? –

3

Można użyć funkcji $.map z jQuery:

var value = $.map(example, function() { 
    return this.name; 
}); 

ta zwróci tablicę elementów.

+0

Ta odpowiedź działa, ale poniższa została zaakceptowana, ponieważ może wykonywać wszystkie nazwy właściwości, których potrzebuję w tym samym czasie. +1 – awimley

5

Zrobiłem szybki test dla ciebie tutaj: http://jsperf.com/jquery-vs-javascriptlvjsklvjsfklsfklsdjfk

Składa się on z trzech s olutions:

podstawową dla pętli

for (var i = 0; i < example.length; i++) { 
    array.push(example[i].name); 
} 

jQuery $ .each()

$.each(example, function(i, item) { 
    array.push(example[i].name); 
}); 

I jedna odpowiedź wysłana do tego wątku

Object.keys(example).forEach(function(key) { 
    //get the value of name 
    var val = example[key]["name"]; 
    //push the name string in the array 
    array.push(val); 
}); 

Oto wyniki (większy pasek jest lepszy)

Zasadniczo należy pamiętać, że jQuery może mieć skrót, na który składa się "mniej kodu", ale w rzeczywistości będzie miał gorszą wydajność niż w przypadku samodzielnego napisania kodu.

+0

Chociaż forEach jest najwolniejszy, nie martwię się prędkością i pozwala mi to zrobić dla wszystkich właściwości, których potrzebuję z jedną pętlą (przez brak return statement) .Dziękuję za Twój wkład, zdecydowałem się użyć forEach, ponieważ jest on najszybszy do napisania dla mojej aplikacji – awimley

+0

To jest najlepsza odpowiedź na pytanie! Możesz poprawić pętlę lepiej, sprawdzając długość raz na błaganie i przechowywanie go jako lokalnego var zamiast sprawdzania przy każdym cyklu pętli, tj. dla (var i = 0, x = example.length; i firefields

1

Jest to najprostsze rozwiązanie mogę myśleć:

function doThat (myArray) { 
    newObject = {}; 
    myArray.forEach(function (obj, idx) { 
    var keys = Object.keys(obj); 
    keys.forEach(function (key) { 
     if (!obj[key]) { 
     newObject[key] = []; 
     } 
     newObject[key][idx] = obj[key]; 
    }); 
    }); 
    return newObject; 
} 
+0

Myślę, że moje rozwiązanie jest bardziej ogólne, ponieważ zachowuje wszystkie indeksy tak jak gdyby były jednym z o bjecty w tablicy straciły własność – Aleuck

2

Oto jak to zrobić za pomocą jinqJs

linii kodu jest:

jinqJs().from(example).select(function(row){return row.name;}); 

var example = [{ 
 
    name: "someone1", 
 
    city: "somewhere1", 
 
    state: "someplace1" 
 
},{ 
 
    name: "someone2", 
 
    city: "somewhere2", 
 
    state: "someplace2" 
 
}]; 
 

 
var result = jinqJs().from(example).select(function(row){return row.name;}); 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 2) + '</pre><br><br>';
<script src="https://rawgit.com/fordth/jinqJs/master/jinqjs.min.js"></script>

Powiązane problemy