To całkiem proste pytanie, ale nie mogę zrozumieć, co robię źle. Powiedz, że mam ten obiekt:

features: {
    savings: {
        link: "test.html",
        img: "/_assets/img/related-content/sample.png"
    },
    security: {
        link: "test2.html",
        img: "/_assets/img/related-content/sample2.png"
    },
    speed: {
        link: "test3.html",
        img: "/_assets/img/related-content/sample3.png"
    }
}

Załóżmy, że ten format jest ustawiony i nie można go zmienić. Mogę łatwo wybrać, robiąc coś takiego jak features["savings"].link. Ale powiedzmy, że chcę uzyskać losowy przedmiot z tego obiektu. Wygeneruję liczbę losową, a następnie wybierz indeks za pomocą tego. Ale features[randnum].link nie działa. Dlaczego to? Jak mogę to zrobić bez modyfikacji formatu obiektu?

Dzięki!

2
Paul Erdos 20 październik 2011, 19:10

3 odpowiedzi

Najlepsza odpowiedź

To dlatego, że masz do czynienia z obiektem, a nie tablicą, więc nie możesz indeksu w obiekcie z tylko liczbą. Musisz coś zrobić:

var randnum = getRandomNumber(1, 3); // get random num between 1 and 3
var randomLink = features["feature" + randnum].link;

Tylko do wyjaśnienia, ta notacja:

features["feature1"].link;

Jest taki sam jak

features.feature1.link;

Jeśli nie masz nazw nieruchomości, które można łatwo generować, jak "Security" lub "Savings", można użyć tablicy, aby pomóc, zakładając, że właściwości są statyczne.

var properties = [ "security", "savings" ];
var randomProperty = properties[Math.floor(Math.random() * properties.length)];
var randomLink = features[randomProperty].link;

Jeśli nie wiesz, co masz właściwości, będziesz, możesz je zebrać:

var properties = [];
for (var prop in features) {
    if (features.hasOwnProperty(prop)) {
        properties.push(prop);
    }
}
var randomProperty = properties[Math.floor(Math.random() * properties.length)];
var randomLink = features[randomProperty].link;
3
Einacio 20 październik 2011, 15:35

JS Obiekty nie są indeksowane Numerycznie, nie możesz uzyskać dostępu do niej jako tablicy za pomocą liczb całkowitych.

0
Einacio 20 październik 2011, 15:14

Funkcje [coś] w stosunku do oryginalnej struktury JSON sprawi, że szuka funkcji. Można jednak faktycznie sprawić, że zawiera szereg obiektów JSON. To da ci swój dostępny dostęp. Jednak pojawi się funkcja "wyszukiwania", aby znaleźć funkcję3, chyba że umieścisz pomysł na tworzenie tablicy.

W przypadku funkcji [Randuminteger] .link, zmień do struktury poniżej:

var features = [{
        name:"feature1",
        link: "test.html",
        img: "/_assets/img/related-content/sample.png"
    },
    {
        name:"feature2",
        link: "test2.html",
        img: "/_assets/img/related-content/sample2.png"
    },
    {
        name:"feature3",
        link: "test3.html",
        img: "/_assets/img/related-content/sample3.png"
    }]
0
DefyGravity 20 październik 2011, 15:17