将字符串映射到数组的最佳方式,取决于其他数组的值

3

给定一个数组:

var arrOfObj = [{
  name: 'eve',
  col1 : 1,
  col2 : 0,
  col3 : 1
}, {
  name: 'john',
    col1 : 1,
  col2 : 1,
  col3 : 0
}, {
  name: 'jane',
  col1 : 0,
  col2 : 1,
  col3 : 1
}];

如果它们的值为1,我需要在数组中有一个字段,其字符串名称为col1、col2、col3的名称。样本结果如下:

var arrOfObj = [{
  name: 'eve',
  col1 : 1,
  col2 : 0,
  col3 : 1,
  account : "col1,col3"
} //etc
}]

我目前可以通过以下方式实现这一点:

var result = arrOfObj.map(function(o) {
  o.account = ""
  if (o.col1 > 0) {o.account  = o.account + "col1,"} ;
  if (o.col2 > 0) {o.account= o.account + "col2,"} ;
  if (o.col3 > 0) {o.account= o.account + "col3,"} ;
  o.account = o.account.slice(0, -1);
  return o;
})

console.log(result)

但是对于 JS 新手来说,这种方法感觉不够高效。我的实际数组有十几个这样的列需要进行评估。

编辑:在接受的答案的帮助下完成了最终产品:

var bool_cols = ["col1","col2","col3"]

data.forEach(x => {
        x.services = Object.keys(x).filter (y => bool_cols.includes(x) && x[y] == 1).join (',');
    })

我喜欢能够无限扩展过滤条件的功能!

3个回答

3
如何呢?
arrOfObj.forEach ( (x) => {
    x.account = Object.keys(x).filter (y => x[y] == 1).join (',');
})

我能只对数组的某些部分进行操作吗?比如列1、2和3,但不包括名称(Name)? - DCUFan7
1
@DCUFan7你可以在过滤函数中添加更多的条件,例如filter(y => x[y] == 1 && y.contains("col")) - flappix
我喜欢这个使用过滤器和连接的功能。第二个过滤器中的包含看起来对我也有用。谢谢! - DCUFan7

2

我会遍历对象的键,并检查键是否以'col'开头。

var arrOfObj = [{
  name: 'eve',
  col1 : 1,
  col2 : 0,
  col3 : 1
}, {
  name: 'john',
    col1 : 1,
  col2 : 1,
  col3 : 0
}, {
  name: 'jane',
  col1 : 0,
  col2 : 1,
  col3 : 1
}];

const res = arrOfObj.map(x => {
  let acc = [];
  Object.keys(x).forEach(k => {
    if(k.startsWith('col') && x[k] === 1){
      acc.push(k)
    }
  })
  return {...x, account: acc.join(',')}
});

console.log(res)


1
你可以使用 var Object.keys(object); 来获取对象的键名,然后检查值。
var result = arrOfObj.map(function(o) {
  var keys = Object.keys(o);
  var keyArray = [];
  keys.forEach((key) => {
      if (o[key] > 0) { 
        // Declare the account property, only
        // when it's needed. Otherwise, get it out of the foreach
        keyArray.push(key);
      }
  });
  o['account'] = keyArray.join(',');
});

已更新,加上了逗号。 - Athanasios Kataras
@AthanasiosKataras,那个模式只是糟糕的代码,只需将其推入数组,然后在最后用逗号连接即可... - balexandre
为什么要在追加键之前将帐户设置为空字符串呢?直接将其设置为键即可。此外,将逗号分隔符嵌入到追加的字符串值中只会导致混淆,并使以后更难管理输入更改。使用join代替可以解决所有这些问题。 - Cooper Buckingham
因为 += 导致了 undefinedcol1 - Athanasios Kataras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接