如何在JavaScript中过滤数据

时间:2019-03-20 18:15:01

标签: javascript arrays sorting filter

我正在研究React本机项目。

那样,我从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数组,我需要将每个数据索引显示到平面列表中。 但是,在这里我迷惑了如何将其放入另一个数组,因为每个索引的键结尾处的Return键具有1,3,5等。

const ValuesData = [];

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

有人可以建议我如何将Return(1,3,5,10)数据放入数组吗?

6 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

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

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。

答案 2 :(得分:0)

返回键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);

答案 3 :(得分:0)

假设:

我假设您的密钥始终像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 :(得分:0)

以下应该可以工作:

const ValuesData = [];

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

答案 5 :(得分:0)

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

library(dplyr)
library(tibble)
library(purrr)

tibble(x = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
  mutate(Sum = map_dbl(x, function(i)sum(as.numeric(i))))
#> # A tibble: 3 x 2
#>   x           Sum
#>   <list>    <dbl>
#> 1 <chr [3]>    87
#> 2 <chr [2]>    22
#> 3 <chr [2]>     3

哪个会给您结果?

let ValuesData = []

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

这与回车后的数字无关。因此,您可以使用Return12,Return1345,Return76524等,仍然可以获得所需的结果。