使用.filter数据获取特定值

时间:2019-08-13 13:42:16

标签: javascript

我有一个包含文本数据的网页:

  const memo = fn => {
    const cache = {};
    return (...args) => {
      const key = JSON.stringify(args);
      if(key in memo) return memo[key];
      return memo[key] = fn(...args);
    };
  };

  const memoizedF = memo(f);

我只希望显示[ { "Id":1, "Nombre":"DÓLAR B.NACIÓN", "VariacionPorcentual":3.63636, "Compra":52, "Venta":57, "UltimaActualizacion":"2019-08-13T10:32:02.810Z", "Orden":1 }, { "Id":2, "Nombre":"DÓLAR BLUE", "VariacionPorcentual":19.40298, "Compra":53, "Venta":56, "UltimaActualizacion":"2019-08-13T10:32:02.810Z", "Orden":2 } ] 等于1的数据。我知道我应该使用Id,但是我不知道如何在我的代码中实现它。 .filter()应该过滤bna.compra,bna.venta等字段的值。

Id

例如,我需要获取:

function getBNA(callback){
  request("URL", function(err, response, body){
         if (err)
        {
          console.log("Error getting information from Lanacion", err);
          return
        }
        var bna = JSON.parse(body);
        callback(bna);
  });
}

app.all(`/${process.env.BOT_ENDPOINT}`, function(req, res){

  var cotizaciones = cotizaciones.filter(id => id===1);
  getVariacion((dolar) => getBNA((bna) => {
    var status = `?️ ${dolar.fecha}
?Informal:
Compra: $${dolar.compra} | Venta: $${dolar.venta}
Variación: ${dolar["class-variacion"]!=='up' ? "?" : "?"} ${dolar.variacion}

?BNA: 
Compra: $${bna.compra} | Venta: $${bna.venta}
Variación: ${(bna.VariacionPorcentual)==0 ? "➖" : (bna.VariacionPorcentual)<0 ? "?" : "?"} ${(bna.VariacionPorcentual)}%`;  

以下是Id:1的值

?️ 12/09/2019 - 10:30
?Informal:
Compra: $51,88 | Venta: $54,08
Variación:? 16,18%

4 个答案:

答案 0 :(得分:5)

  

我知道我应该使用.filter()...

不是,如果您只想查找一个项目。为此,您使用find

var cotizacion = cotizaciones.find(({Id}) => Id === 1);

实时示例:

const cotizaciones = [{"Id":1,"Nombre":"DÓLAR B. NACIÓN","VariacionPorcentual":3.63636,"Compra":52,"Venta":57,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":1},{"Id":2,"Nombre":"DÓLAR BLUE","VariacionPorcentual":19.40298,"Compra":53,"Venta":56,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":2}];
var cotizacion = cotizaciones.find(entry => entry.Id === 1);
console.log(cotizacion.VariacionPorcentual, cotizacion.Compra, cotizacion.Venta, cotizacion.UltimaActualizacion);

请注意,我在参数列表中使用了分解以从对象中选择id属性。无需破坏:

var cotizacion = cotizaciones.find(entry => entry.Id === 1);

实时示例:

const cotizaciones = [{"Id":1,"Nombre":"DÓLAR B. NACIÓN","VariacionPorcentual":3.63636,"Compra":52,"Venta":57,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":1},{"Id":2,"Nombre":"DÓLAR BLUE","VariacionPorcentual":19.40298,"Compra":53,"Venta":56,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":2}];
var cotizacion = cotizaciones.find(entry => entry.Id === 1);
console.log(cotizacion.VariacionPorcentual, cotizacion.Compra, cotizacion.Venta, cotizacion.UltimaActualizacion);


FWIW,我强烈建议从var移至letconst。 :-)

答案 1 :(得分:0)

首先,您应该有一个要过滤的数组。

从我的示例代码中可以看到,

cotizaciones并不是数组。

因此,首先将数组值分配给cotizaciones。

一旦cotizaciones是一个数组,就可以像下面那样实现过滤器: cotizaciones.filter(arrValue => arrValue.id === 1);

arrValue只是一个名称,可以是任何名称。但是我认为这很清楚;)

您还可以使用cotizaciones.find(arrValue => arrValue.id === 1);

如果您只需要从数组中找到一个对象,那是更好的选择。

答案 2 :(得分:0)

首先,如果您要比较ID的键列表,则需要一个键集:

const mySet = new Set(['a','b','c'])

然后您需要过滤数据。

const rows = [.....];
const result = rows.filter( row => mySet.has(row.Id))

其中ID是要查看的密钥。

这将使运行时为O(n + m),其中n是集合的转换/生成,m是行的遍历。

答案 3 :(得分:0)

是的,如果您期望一个包含多个具有相同“ Id”的对象/条目的数据集,则filter()方法将很有用。另外,它很容易实现。在这里。

function filterData(data, id) {
    return data.filter(item => item["Id"] === id);
}

var data = [{"Id":1,"Nombre":"DÓLAR B. NACIÓN","VariacionPorcentual":3.63636,"Compra":52,"Venta":57,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":1},{"Id":2,"Nombre":"DÓLAR BLUE","VariacionPorcentual":19.40298,"Compra":53,"Venta":56,"UltimaActualizacion":"2019-08-13T10:32:02.810Z","Orden":2}];

console.log(filterData(data, 1));