【问题标题】:How do you query objects in JavaScript?你如何在 JavaScript 中查询对象?
【发布时间】:2020-04-16 19:29:08
【问题描述】:

所以,我是一名 SQL 开发人员,现在发现自己正在编写 JavaScript,但我不知道自己在做什么。我需要帮助查询对象。假设我有以下对象数组

    var addresses = [
    { street: '104 Bob st', city: 'Boringville', state: 'NC' },
    { street: '207 Ted rd', city: 'Quiettown', state: 'NC' },
    { street: '309 Jim ln', city: 'Lameburg', state: 'VA' }
    ];

我需要做一些事情,比如获取州或城镇的列表。在 SQL 中,这只是小菜一碟,它只是 SELECT city FROM 地址,或 SELECT DISTINCT state FROM 地址,或任何您需要做的事情。但是,您到底是如何在 JavaScript 中做到这一点的呢?

【问题讨论】:

  • 这能回答你的问题吗? How to filter an array in javascript?
  • OP 要求的是地图,而不是过滤器。
  • 你怎么做取决于你想做什么。从地址中选择城市 => addresses.map(a => a.city);从地址中选择不同的状态 => new Set(addresses.map(a => a.state))
  • @MichaelRand 你熟悉 C# LINQ 扩展方法吗? This gist 可能是对等价 JavaScript 数组方法的一个很好的总结。

标签: javascript


【解决方案1】:

你可以使用数组的map function,它返回另一个数组:

const result = addresses.map(address => address.state)
console.log(result) // ['NC', 'NC', 'VA']

【讨论】:

    【解决方案2】:

    您可以使用.map() 函数。这里有一些例子:

    var addresses = [
        { street: '104 Bob st', city: 'Boringville', state: 'NC' },
        { street: '207 Ted rd', city: 'Quiettown', state: 'NC' },
        { street: '309 Jim ln', city: 'Lameburg', state: 'VA' }
    ];
    
    var states = addresses.map(a => a.state);
    var cities = addresses.map(a => a.city);
    var fullAddress = address.map(a => a.street + ', ' + a.city + '/' + a.state);
    

    你只需要传递一个函数作为参数。该函数必须为来自数组的每个元素生成一个新值。在我的示例中,a 代表数组的每个单独元素。箭头 (=>) 之后的所有内容都是每个元素应生成的内容。你可以使用操作,调用其他函数……任何东西。结果是一个新数组,它与原始数组的长度相同,并且以相同的顺序包含每个元素的结果。

    【讨论】:

      【解决方案3】:
      var addresses = [
      { street: '104 Bob st', city: 'Boringville', state: 'NC' },
      { street: '207 Ted rd', city: 'Quiettown', state: 'NC' },
      { street: '309 Jim ln', city: 'Lameburg', state: 'VA' }];
      
      
      const fullAddress = addresses.map(address => {
      return `State: ${address.state}, City: ${address.city}, Street:${address.street}`;
      });
      console.log(fullAddress);
      

      使用模板字符串、对象解构和隐式返回,不需要花括号和返回语句;使用 es6 的更清晰的方法

      const fullAddress = addresses.map(({street, city, state}) =>
      `State: ${state}, City: ${city}, Street:${street}`);
      console.log(fullAddress);
      

      【讨论】:

        【解决方案4】:

        或者你可以使用过滤方法。

         var addresses = [
            { street: '104 Bob st', city: 'Boringville', state: 'NC' },
            { street: '207 Ted rd', city: 'Quiettown', state: 'NC' },
            { street: '309 Jim ln', city: 'Lameburg', state: 'VA' }
            ];
            
            const result = addresses.filter(address => address.state=='NC');
            
            console.log(result);

        【讨论】:

          【解决方案5】:

          您可以在 Javascript 中模仿一些 SQL 语句,例如

          例如,您也可以使用 LINQ 样式的请求语言。

          var addresses = [
                  { street: '104 Bob st', city: 'Boringville', state: 'NC' },
                  { street: '207 Ted rd', city: 'Quiettown', state: 'NC' },
                  { street: '309 Jim ln', city: 'Lameburg', state: 'VA' }
              ],
              cities = Enumerable.From(addresses).Select('$.city').ToArray(),
              states = Enumerable.From(addresses).Select('$.state').Distinct().ToArray();
              
          console.log(...cities);
          console.log(...states);
          <script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-26
            • 1970-01-01
            • 2023-03-09
            • 2021-08-15
            相关资源
            最近更新 更多