使用变量作为键访问对象值

时间:2019-05-08 12:01:27

标签: dart

我正在尝试使用以前在dart中定义的变量来访问类值,但是我不断收到错误the operator [] isn't defined for the class

在Javascript中,我将使用类似这样的变量来访问对象值:

let movie = {
  movieTitle : 'Toy Story',
  actor: 'Tom Hanks'
}

let actorName = 'actor';
console.log(movie[actorName]); // <- what I'm trying to replicate in dart
// expected output: Tom Hanks

这是我尝试过的并且正在抛出该错误

class Movie {
  String name;
  String actor;
  String producer;
}

void main() {
  var movieTitle = new Movie();
  movieTitle.name = 'Toy Story';
  movieTitle.actor = 'Tom Hanks';

  print(movieTitle.actor); <- prints out Tom Hanks as expected

  var actorName = 'actor';

  print(movieTitle[actorName]); <- throws error
}

我希望能够即时使用变量来访问该值。

对我来说,一个微不足道的用例是,如果我有一个Movie类列表,其中一些actor和监制为null,那么我想用这样的函数对非null actor或监制进行过滤:

List values = movieList.where((i) => i.actor != "null").toList(); // returns all Movies in movieList where the actor value isn't the string "null"

var actorIsNull = 'actor';

List values = movieList.where((i) => i[actorisNull] != "null").toList(); // throws error

2 个答案:

答案 0 :(得分:2)

您不能通过包含类名的字符串来访问类成员。 (带镜子除外-不在此答案范围内。)

您可以完全删除该类,而只需使用Map<String, String>

Map<String, String> movie = {
  'movieTitle': 'Toy Story',
  'actor': 'Tom Hanks',
}

您可以在类上添加一些bool方法。

bool hasNoActor() => actor == null;
...
List values = movieList.where((m) => !m.hasNoActor()).toList();

或者,您可以将lambda传递给映射器。

  Movie movieTitle = Movie()
    ..name = 'Toy Story'
    ..actor = 'Tom Hanks';

  Function hasActor = (Movie m) => m.actor != null;
  List values = movieList.where(hasActor).toList();

答案 1 :(得分:1)

您可以在Movie类中创建一个toMap()函数,并使用[] operator

访问属性
class Movie {
  String name;
  String actor;
  String producer;

  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'actor' : actor,
      'producer' : producer,
    };
  }
}

现在可以通过以下方式访问电影类属性:

Movie movie = Movie();
movie.toMap()['name'];