在JavaScript中拆分最后两个单词并过滤。

3
我想知道如何使用 JavaScript 过滤数组值,以 'provider-send' 和 'provider-receive' 为标准分离这些数组。
 var filterradio = id.filter(function(e){       
       return e.id.split("-")[0] == "provider-send"
    })  

var id=["provider-send-credit-transfer", "provider-send-debit-fund","provider-receive-credit-transfer","provider-receive-debit-fund"]


Expected Output:
result_sn: ["provider-send-credit-transfer", "provider-send-debit-fund"]
result_rcn:["provider-receive-credit-transfer","provider-receive-debit-fund"]


如果您在 - 上进行拆分,则不会有任何元素包含其中一个。看看 e.id.split("-")[0] 产生了什么。 - charlietfl
5个回答

1
如果始终是“提供者-接收-...”和“提供者-发送-...”,则可以按照以下方式将它们分开。
for (i = 0; i < id.length; i++) {
    if (id[i].split("provider-send-").length > 1) {
        result_sn.push(id[i]);
    } else if (id[i].split("provider-receive-").length > 1) {
        result_rcn.push(id[i])
    }
}

顺便提一下:你可以直接使用“search”、“startsWith”或“includes”来搜索这个值,而不是拆分它,+1。 - Code Maniac

0

Pass 2 as second parameter to split() and then again join() by -. The second parameter to split() specifies the max number of elements in the result array.

var id=["provider-send-credit-transfer", "provider-send-debit-fund","provider-receive-credit-transfer","provider-receive-debit-fund"]

var filterradio = id.filter(function(id){    
    return id.split("-",2).join('-') === "provider-send"
})  
         
 console.log(filterradio)


为什么不使用 searchincludesstartsWith 而不是 splitjoin - Code Maniac

0

我建议使用reduce而不是filter,因为reduce用于将数组大小减少到单个返回元素。 在这里,我将数组缩小为一个具有两个键result_snresult_rcn的对象。

var id = ["provider-send-credit-transfer", "provider-send-debit-fund", "provider-receive-credit-transfer", "provider-receive-debit-fund"]


const result = id.reduce((obj, str) => {
  if (str.match(/^provider-send/g))
    obj['result_sn'].push(str);
  else
    obj['result_rcn'].push(str);
  return obj;
}, {
  'result_sn': [],
  'result_rcn': []
});

console.log(result)


1
你应该在你的正则表达式中加入“^”,否则它也会匹配“some-provider-send”,即使在这种情况下没有这种情况,但我认为考虑加上是一个好主意,无论如何加一。 - Code Maniac

0

试试这个:

var id = [ "provider-send-credit-transfer", "provider-send-debit-fund","provider-receive-credit-transfer","provider-receive-debit-fund" ] ;

var result_sn = [] , result_rcn = [] ;

for( value of id ) {
  var twoWords = value.split('-',2).join('-') ;
  if ( twoWords === "provider-send" ) 
    result_sn.push( value ) ;
  else if ( twoWords === "provider-receive" )
    result_rcn.push( value ) ;
}

console.log( result_sn ) ;
console.log( result_rcn ) ;


1
你没有正确使用 filter,因为你没有从 id 中过滤任何内容,你应该使用 reduceforforEach - Code Maniac
@CodeManiac,你好我的朋友,请查看更新的帖子。谢谢。 - Ehsan

0

使用.filter()需要为每个要匹配的模式编写1个过滤器并将其分配给变量。

建议使用.reduce(),它更易于扩展以支持更多模式。

一开始可能看起来令人生畏,但实际上您基本上是使用accumulator作为临时变量,该变量被存储并传递到每次迭代。数组的每次迭代都会使用currentValue提供当前迭代值。

我已添加something-else作为添加新模式的示例。

var id = [
  "provider-send-credit-transfer",
  "provider-send-debit-fund",
  "provider-receive-credit-transfer",
  "provider-receive-debit-fund",
  "something-else-credit-transfer",
  "something-else-debit-fund"
];

const {
  'provider-send': result_sn,
  'provider-receive': result_rcn,
  'something-else': result_ste
} = id.reduce(function(accumulator, currentValue) {
  let prefix = currentValue.match(/^\w+-\w+/)[0];
  return {...accumulator, [prefix]: (accumulator[prefix] || []).concat(currentValue)}
}, {});

console.log(result_sn);
console.log(result_rcn);
console.log(result_ste);


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