【问题标题】:How to filter data in javascript如何在javascript中过滤数据
【发布时间】:2019-03-20 18:15:01
【问题描述】:

我正在开发 React Native 项目。

其中,我从 api 获取多个数据,如下所示。

{
    Value: "895"
    Return: "2"
    Return1: "0.20"
    Return3: "0.40"
    Return5: "0.60"
    Return10: "0.50"
    StartDate: "2019-06-13"
}, {
    Value: "900"
    Return: "4"
    Return1: "0.10"
    Return3: "0.40"
    Return5: "0.70"
    Return10: "0.90"
    StartDate: "2019-06-14"
},

但是,我正在尝试将所有 Return 数据放入某个返回数组,我需要将每个数据索引显示到平面列表中。 但是,在这里我很困惑如何将它放入另一个数组,因为 Return 键在每个索引的键的末尾都有 1、3、5 等。

const ValuesData = [];

if (ReturnsData) {
  ReturnsData.map((item, index) => {
    ValuesData.push({
     `${ReturnsData[index].Return`${index}`}`,
    });
  });
}

谁能建议我如何将 Return(1,3,5,10) 数据放入数组中?

【问题讨论】:

  • 你能创建一个可运行的sn-p吗?了解如何创建minimal reproducible example
  • 只需将响应(猜测 reactjs 有此选项)转换为您想要返回的任何内容。对于returnX,您可以迭代键并将所有匹配模式的键推入结果数组..
  • 我是 react native 的新手,您可以发布任何示例吗?

标签: javascript arrays sorting filter


【解决方案1】:

startWithgetOwnPropertyNamesObject.keys( your_object ) 一起使用。

var apiData = [{
    Value: "895",
    Return: "2",
    Return1: "0.20",
    Return3: "0.40",
    Return5: "0.60",
    Return10: "0.50",
    StartDate: "2019-06-13",
}, {
    Value: "900",
    Return: "4",
    Return1: "0.10",
    Return3: "0.40",
    Return5: "0.70",
    Return10: "0.90",
    StartDate: "2019-06-14",
}]

/* All values of each key thats starts with "Return" in flat array */
const valuesFlat = []
apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it).filter( prop => prop.startsWith("Return") )
	.map( name => apiData[idx][name]  )
	.forEach( its => valuesFlat.push(its) )
)
console.log( "Flat values" )
console.log( valuesFlat )

/* All values of each key thats starts with "Return", not flat array */
const values = apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it).filter( prop => prop.startsWith("Return") )
	.map( name => apiData[idx][name]  )
)
console.log("Values")
console.log(values)


const indexes = apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.map( (prop, idxs) => { if(prop.startsWith("Return")) return idxs} )
	.filter( prop => prop != undefined )
)
console.log("indexes")
console.log( indexes )



const indexesFlat = []

apiData.forEach( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.map( (prop, idxs) => { if(prop.startsWith("Return")) return idxs} )
	.filter( prop => prop != undefined )
	.forEach( it => indexesFlat.push(it) )
)

console.log("Flat indexes")
console.log( indexesFlat )

const flatPropsWithValues = []
apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.filter( prop => prop.startsWith("Return") )
	.forEach( prop => flatPropsWithValues.push( { prop: prop, value: apiData[idx][prop] } ) )
)


console.log("Flat props with values")
console.log( flatPropsWithValues )

Log.d(TAG, "runON" + Thread.currentThread().getName());

【讨论】:

    【解决方案2】:

    改用正则表达式匹配和循环:

    const ValueData = [];
    const re = new Regex('(Return[0-9]{1,2})');
    if (ReturnsData) {
      for (const key in ReturnsData) {
        if (if ReturnsData.hasOwnProperty(key) && re.test(key)) {
          ValueData.push(ReturnsData[key]);
        }
      }
    }
    

    正则表达式应匹配以“Return”开头并以一两个数字结尾的任何数据。 for...in 循环遍历键,检查它们是否存在于对象上,以及它们是否与正则表达式匹配。如果这样做,则将该键的值添加到 ValueData。

    【讨论】:

      【解决方案3】:

      假设:

      我假设您的密钥总是像 Return, Return1, Return3, Return5 and Return10 并且您的数据已经存储在一个数组中(名为 ReturnsData)。在这种情况下,您可以执行以下操作:

      var ValuesData = []; 
      if (ReturnsData) {
        ValuesData = ReturnsData.map((item) => {
            return { item.Return, item.Return1, item.Return3, item.Return5, item.Return10 }; 
        });
      }
      

      说明:

      map 函数默认返回一个新数组。这就是我们可以将新数组直接存储在ValuesData 中的原因。在 map 函数中,我们循环遍历您的对象。然后item.YOUR_KEY 可以访问每个对象的元素。最后我们返回一个新对象。然后正在处理下一个对象。

      【讨论】:

        【解决方案4】:

        首先,我认为您最好使用 forEach 而不是 map,因为您没有将该语句分配给新数组并且没有在函数体内返回任何内容。在 forEach 中,您可以遍历每个键并进行正则表达式测试以查看该键是否以“Return”开头。如果是,则将与该键关联的值推送到您的 ValuesData 数组中。

        let ValuesData = []
        
        ReturnsData.forEach(item => {
            let reg = new RegExp(/^Return.*/)
            for (key in item) {
                if (reg.test(key)) {
                    ValuesData.push(item[key]);
                }
            }
        })
        

        这会给你结果:

        ["2", "0.20", "0.40", "0.60", "0.50", "4", "0.10", "0.40", "0.70", "0.90"]
        

        无论 Return 之后是什么数字,这都会发生。因此,您可以使用 Return12、Return1345、Return76524 等,但仍能获得所需的结果。

        【讨论】:

          【解决方案5】:

          以下应该有效:

          const ValuesData = [];
          
          if (ReturnsData) {
            ReturnsData.map((item, index) => {
              ValuesData.push({
                ReturnsData[index][`Return${index}`],
              });
            });
          }
          

          【讨论】:

          • ['Return${index}']}` --> 意外的模板字符串表达式.eslint(no-template-curly-in-string)
          • 意外的字符串连接.eslint(prefer-template)
          • 我相信还有其他更好的答案,我只是想为您修复插值字符串,这不是您想要的正确解决方案。
          【解决方案6】:

          返回键值的数组 Return1Return3Return5Return10

          const ReturnsData = {
            Value: "900",
            Return: "4",
            Return1: "0.10",
            Return3: "0.40",
            Return5: "0.70",
            Return10: "0.90",
            StartDate: "2019-06-14"
          };
          
          const regex = /Return(1|3|5|10)/;
          
          const ValuesData = Object.entries(ReturnsData)
            .filter(([k, v]) => regex.test(k))
            .map(([k, v]) => v);
          
          console.log(ValuesData);

          【讨论】:

          • 我重新阅读了这个问题,看起来你只想要Return1Return3Return5Return10,所以我更新了我的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 2018-02-05
          • 2021-09-10
          • 2018-01-27
          • 1970-01-01
          相关资源
          最近更新 更多