Я пытаюсь сохранить данные в переменной JavaScript.

Вот мой сценарий: у меня есть список людей (person_id, person_name), и у каждого человека есть домашние животные (pet_id, pet_name) и / или игрушки (toys_id).

[Persons]
   Person_Id
   Person_Name
   [Pets]
      Pet_Id
      Pet_Name
   [Toys]
      Toy_Id

Я пробовал разные вещи, и даже если иногда я могу получить все на хранение, я не уверен, что делаю это правильно.

Должен ли я хранить идентификаторы как ключи? Как это правильно сделано? Зная позже, я постараюсь узнать, сколько домашних животных и игрушек есть у каждого человека. Кроме того, моя переменная должна хранить 1 или несколько человек.

 var myVar = {person_id:{
                person_name:'',
                pet_id:{
                    pet_name:''
                },
                toys:{
                    toys_id:''
                }
            }};

Некоторая помощь будет очень признательна.

2
WerdZerg 19 Дек 2015 в 19:50

4 ответа

Лучший ответ

Я думаю, это зависит от того, как вы собираетесь использовать коллекцию людей. Сохранение массива объектов person будет означать, что изменение лица включает в себя поиск человека в массиве, объединение человека из массива, внесение изменений и вставку их обратно. Если отдельные лица редко модифицируются, то массив может соответствовать всем требованиям.

Однако, если вы будете часто изменять отдельные объекты-личности, то их хранение в качестве свойств объекта может быть проще. Например

var people = {
    person_id1: {
        person_id: "person_id1",
        person_name: "person_name1",
        pets: [
            {
                pet_id: "pet_id1",
                pet_name: "pet_name1"
            },
            {
                pet_id: "pet_id2",
                pet_name: "pet_name2"
            }
        ],
        toys: []
    },
    person_id2: {
        person_id: "person_id2",
        person_name: "person_name2",
        pets: [],
        toys: [
            {
                toy_id: "toy_id1",
                toy_name: "toy_name1"
            }
        ]
    }
};

Это позволит вам изменить любого человека, зная его идентификатор.

people["person_id1"].toys.push({toy_id: "toy_id2", toy_name: "toy_name2"});

Или

people.person_id1.toys.push({toy_id: "toy_id2", toy_name: "toy_name2"});
0
agentscarn 19 Дек 2015 в 17:26

Вы можете использовать структуру, как показано ниже. Когда идентификаторы отличаются, тогда нет необходимости заключать их в массив.

Еще один хороший способ - сохранять свойства простыми как name вместо pet_name или toy_name.

Ниже приведен пример, как перебирать объект и получать от него всех домашних животных и игрушки.

var object = {
    p01: {
        name: 'Anakin',
        pets: {
            pet01: {
                name: 'Cat'
            }
        },
        toys: {
            R2D2: {
                name: 'Roboter 1'
            },
            C3PO: {
                name: 'Roboter 2'
            }
        }
    },
    'FN-2187': {
        name: 'Finn',
        pets: {
            pet03: {
                name: 'Sam'
            }
        },
        toys: {
            BB8: {
                name: 'Roboter 3'
            }
        }
    }
};

function getItem(type) {
    var array = [];
    Object.keys(object).forEach(function (k) {
        Object.keys(object[k][type]).forEach(function (kk) {
            array.push(object[k][type][kk].name + ' (' + kk + ') owned by ' + object[k].name  + ' (' + k + ')');
        });
    });
    return array;
}

document.write('<pre>' + JSON.stringify(getItem('pets'), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(getItem('toys'), 0, 4) + '</pre>');
0
Nina Scholz 19 Дек 2015 в 17:33

Я думаю, что лучший способ хранить людей в массиве

var persons = [
               {
                person_id:1,
                person_name:'per1',
                pets:[
                      {id:1,name:"petname1"},
                      {id:2,name:"petname2"}
                    ]
                ,
                toys:[{id:1,name:"toyname1"},{id:2,name:"toyname2"}]
              }
            ];
//to find person by id=1
var arr=persons.filter(function(obj){return obj.person_id=1});
alert(arr.length)
if(arr.length>0){
//to find pets length 
  alert(arr[0].pets.length)
  }
1
Suhail Keyjani 19 Дек 2015 в 17:06

Некоторые сценарии требуют повторения элементов в списке, поэтому хранение идентификаторов в качестве ключей не позволяет реализовать это. Но если все же решите использовать идентификаторы в качестве ключей, укажите также идентификаторы в качестве значений

{
    "123":
    {
        "ID": 123,
        "Name": "some name"
    }
}
0
Gene R 19 Дек 2015 в 18:14