存储一个带有数组的对象?

时间:2016-06-05 15:15:46

标签: javascript node.js

有没有办法存储object array[id] = "certain value",以便每个用户都有一个喜欢的内容列表?

我想要实现的是首先让数据对象具有未定义的值,然后将其填入,例如Jack和Sam可以保存已分配的收藏电影。

我试过这样的事情没有成功:

Data.js:

module.exports = function() {
    return {
        favMovie: ""
    }
};

App.js:

var person [] = data();

//1st person
person[811767132257839].favMovie = "Matrix";

//2nd person
person[107230716367889].favMovie = "Kill Bill";

//3rd person
person[973676332752239].favMovie = "Avatar";

...

console.log( "Favorite movie: " + person[id].favMovie );

1 个答案:

答案 0 :(得分:6)

听起来你根本不需要任何数组,只是对象。

// Create an object that we'll keep person objects in
var personData = {};

// Add a person object to it for person ID #123
personData[123] = {};

// Set person #123's favorite movie:
personData[123].favMovie = "Avatar";

// Add a different person; this time, we'll add the movie at
// the same time
personData[234] = {
    favMovie: "Matrix"
};

当使用对象作为这样的地图时,有时人们使用Object.create(null)创建对象以避免它们具有任何继承属性(如toStringvalueOfconstructor):

person[123] = Object.create(null);
person[123].favMovie = "Avatar";

在ES2015(又名“ES6”)中,您可能希望使用Map而不是对象作为人物地图:

var personData = new Map();

...然后将setget用于个人对象。

如果单个人对象变得复杂,您可以使用构造函数和相关原型,使用ES5语法:

function Person() {
    // ...
}
Person.prototype.doSomething = function() {
    // ...
};

...或ES2015语法:

class Person {
    constructor() {
        // ...
    }
    doSomething() {
        // ...
    }
}

然后创建它们:

personData[123] = new Person();
// or if using Map
personData.set(123, new Person());

旁注:即使我们将它们写成数字,对象中的键(属性名称)也始终是字符串(除非你使用ES2015 Symbol s,你可能不会这里)。相比之下,ES2015 Map中的键可以是任何东西。 Map实例中的密钥相等是使用特殊的"same value zero"算法确定的(除了===等于它自己之外基本上是NaN [而不是=== }}])。