Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何过滤与对象中特定键对应的值?_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 如何过滤与对象中特定键对应的值?

Javascript 如何过滤与对象中特定键对应的值?,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我需要按类别分离对象中的值,这从对象的键名称中可见。以下是对象的部分外观: const values = { RM1: 'Rarely', RM2: 'Often', RM3: 'Sometimes', RM4: 'Consistently', CM1: 'Rarely', CM2: 'Never', CM3: 'Sometimes', CM4: 'Sometimes'

我需要按类别分离对象中的值,这从对象的键名称中可见。以下是对象的部分外观:

const values = {
        RM1: 'Rarely',
        RM2: 'Often',
        RM3: 'Sometimes',
        RM4: 'Consistently',
        CM1: 'Rarely',
        CM2: 'Never',
        CM3: 'Sometimes',
        CM4: 'Sometimes',
        CO1: 'Often',
        CO2: 'Often',
        CO3: 'Often',
        CO4: 'Sometimes'
}
类别为RM、CM、CO等。我编写了一个函数,将过滤掉这些类别(
答案
是一个较大的对象,
是其中的一部分):

但现在我不知道如何得到对应于这些类别的值。所以对于
RM
,我想要一个类似于这样的数组:
[“很少”、“经常”、“有时”、“一致”]
。其他类别也是如此

有什么想法吗?我觉得这真的很简单,我遗漏了一些明显的东西

有什么想法吗?我觉得这真的很简单,我很想念 很明显

您使用了错误的变量
valuesNames
,请将其设置为以前用相同方法初始化的
valueNames

var categorizeAnswers = (answers) =>{
  const valueNames = Object.keys(answers.values);
  const values = Object.values(answers.values);
  const getCategoryList = category => valueNames.filter(value => { //notice the change from valuesNames to valueNames 
    return value.includes(category);
  })

  const RM = getCategoryList("RM");
  console.log(RM);
  const CM = getCategoryList("CM");
  const CO = getCategoryList("CO");
}
另外,就像
“RM1.includes”(“RM”)
真的一样,
“ARM1.includes”(“RM”)
也是
真的

使用
indexOf

  const getCategoryList = category => valueNames.filter(value => { 
    return value.indexOf(category) == 0;
  })
您可以检查uniuque值并使用

const getCategoryList = category =>
        [...new Set(valuesNames.filter(v => v.startsWith(category))];

使用
for..in
迭代对象&
indexOf
检查键名是否具有传递的字符串

var值={
RM1:‘很少’,
RM2:“经常”,
RM3:'有时',
RM4:'一贯',
CM1:“很少”,
“从来没有”,
CM3:“有时”,
CM4:“有时”,
CO1:“经常”,
二氧化碳:“经常”,
CO3:'经常',
CO4:“有时”
}
函数getValues(键名){
var VALARY=[];
for(让关键点输入值){
if(keys.indexOf(keyName)!=-1&&valArray.indexOf(values[keys])==-1){
valArray.push(值[键])
}
}
返回数组;
}

log(getValues('CO'))
这里有一个使用ES5的非常紧凑的解决方案

const getCategoryList = (category) => {
  const categories = [].concat(Object.keys(answers.values).filter((value) => value.includes(category)));
  const values = [].concat(categories.map((value) => answers.values[value]));
  return [categories, values]
}

const [ categories, values ] = getCategoryList('RM');
console.log(categories, values)

您只需在类别数组上使用map即可在如下数组中获取其值:

const RM = getCategoryList("RM").map((key) => answers.values[key]);

您可以根据属性名的非数字部分动态生成类别,然后将它们添加到一个最初为空的对象中—所有这些都在一个reduce调用中完成。这样,类别就不会硬编码(但需要符合相同的命名模式):

var值={
RM1:‘很少’,
RM2:“经常”,
RM3:'有时',
RM4:'一贯',
CM1:“很少”,
“从来没有”,
CM3:“有时”,
CM4:“有时”,
CO1:“经常”,
二氧化碳:“经常”,
CO3:'经常',
CO4:“有时”
}
函数getCategories(数据){
返回对象。键(数据)。减少(函数(acc,键){
var p=键。替换(/\d+/,“”);
acc[p]?acc[p]。推送(数据[键]):acc[p]=[数据[键];
返回acc;
},Object.create(null));
}
log(getCategories(value))
const RM = getCategoryList("RM").map((key) => answers.values[key]);