【问题标题】:Return values instead of objects in filter() method在 filter() 方法中返回值而不是对象
【发布时间】:2016-10-06 19:10:18
【问题描述】:

我有这个简单的代码:

function getStockOver(stocks) {
    'use strict';
    return stocks.filter(function (stock) {
        return (stock.price > 150);
    });
}

var stocks = [
    { symbol: 'XFX', price: 240.22, volume: 23432},
    { symbol: 'TNZ', price: 110.22, volume: 232},
    { symbol: 'JXJ', price: 340.22, volume: 5632}
];
var symbols = getStockOver(stocks);

console.log(symbols);

检查stock.price > 150.filter()是否返回,否则跳过。 但是我只想返回通过.filter() 创建的新数组中的price,而不是整个对象,如何?

注意:我知道这可以通过.forEach() 完成,但.filter() 更容易。

【问题讨论】:

    标签: javascript arrays methods foreach


    【解决方案1】:

    你想要减少,而不是过滤

    var stocks = [
        { symbol: 'XFX', price: 240.22, volume: 23432},
        { symbol: 'TNZ', price: 110.22, volume: 232},
        { symbol: 'JXJ', price: 340.22, volume: 5632}
    ];
    var results = stocks.reduce( function (a,o) { if(o.price > 150) a.push(o.price); return a; }, []);
    console.log(results);
    

    【讨论】:

    • 谢谢你,非常有用,但是请问如何以新对象而不是数组返回结果?
    • 那么,如果你想要像原来的那样使用过滤器,为什么不使用它呢?
    • 像这样results = { price: 240.22, price: 340 }不确定是否可以这样做,我尝试以空对象作为初始值。
    • 那是不可能的。一个对象不能有相同的键。
    • 糟糕,没有注意到 :D,我会坚持你的 reduce 方法,我很感激。
    【解决方案2】:

    您只需添加Array#map 即可。

    function getStockOver(stocks) {
        'use strict';
        return stocks.filter(function (stock) {
            return (stock.price > 150);
        }).map(function (stock) {
            return stock.price;
        });
    }
    
    var stocks = [
        { symbol: 'XFX', price: 240.22, volume: 23432},
        { symbol: 'TNZ', price: 110.22, volume: 232},
        { symbol: 'JXJ', price: 340.22, volume: 5632}
    ];
    var symbols = getStockOver(stocks);
    
    console.log(symbols);

    【讨论】:

      【解决方案3】:

      您也可以在一行中执行此操作。这些内置函数正是为此目的而设计的。

      symbols = stocks.filter(function(stock){
          return stock.price > 150
      }).map(function(stock){
          return stock.price;
      });
      

      你也可以对对象做一些更复杂的事情:

      var StockList = function( _data ) {
          this.data = _data;
      };
      StockList.prototype.getStocksOver = function( overPrice ) {
          return new StockList(this.data.filter(function (stock) {
              return stock.price > overPrice;
          }));
      };
      StockList.prototype.getPrices = function() {
          return this.data.map(function (stock) {
              return stock.price;
          });
      };
      
      var stocks = new StockList([
          { symbol: 'XFX', price: 240.22, volume: 23432 },
          { symbol: 'TNZ', price: 110.22, volume: 232 },
          { symbol: 'JXJ', price: 340.22, volume: 5632 }
      ]);
      
      var pricesOver150 = stocks.getStocksOver(150).getPrices();
      
      console.log(pricesOver150);
      

      【讨论】:

        猜你喜欢
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 2016-02-16
        • 2017-10-06
        相关资源
        最近更新 更多