迭代数组,添加真实

时间:2016-05-28 07:32:44

标签: javascript ruby-on-rails arrays postgresql

我一直在四处寻找,但不确定我正在寻找合适的东西。

说我有这个

array ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't']

(我在postgresql中有一个真/假的数组,我以前导入到javascript中,并且它会以't'和'f'的形式返回)

我希望将该数组更改为

[1, 3, 6, 1] (adding all the trues in between false)

假设我完全错过了某种非常明显的方式!

4 个答案:

答案 0 :(得分:3)

红宝石:

arr.join.scan(/t+/).map(&:size)
=> [1, 3, 6, 1]

JavaScript的:

arr.join('').match(/t+/gi).map(function(str) {
  return str.length
});



var arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];
sizes = arr.join('').match(/t+/gi).map(function(str) {
    return str.length;
});
console.log(sizes);




答案 1 :(得分:0)

Array#forEach

的提案



function countT(array) {
    var r = [];
    array.forEach(function (a, i, aa) {
        a === 'f' || aa[i - 1] === 't' && ++r[r.length - 1] || r.push(1);
    });
    return r;
}

console.log(countT(['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't']));
console.log(countT(["t", "f", "t"]));
console.log(countT(["f", "f"]));
console.log(countT(["f", "t"]));
console.log(countT(["t", "f"]));
console.log(countT(["t", "t"]));




答案 2 :(得分:0)

在JavaScript中使用 reduce() 方法

var arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];

var res = arr.reduce(function(result, e) {
  if (e == 't') { // check value is `t` and increment the last element in array
    result[result.length - 1] ++;
  } else if (result[result.length - 1] != 0) { // if element is `f` and last eleemnt is not zero then push 0 to the array
    result.push(0);
  }
  return result;
}, [0])

console.log(res);

您可以使用ES6 arrow functionTernary operatorLogical Short-Circuit Evaluation减少行数。

var arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];

var res = arr.reduce((r, e) => {
  e == 't' ? r[r.length - 1] ++ : r[r.length - 1] == 0 || r.push(0);
  return r;
}, [0])
console.log(res);

答案 3 :(得分:0)

这个问题有一个骗局。虽然它清楚地表明了真正的价值观"介于"虚假值在他提供的例子中计算不是这种情况,最后一项是" t"即使没有" f"也被计算在内。所以我在这里有两个解决方案。这个满足了这个例子。



var a = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'],
 code = a.reduce((p,c) => (c == "t" ? p[p.length-1]++ : !!p[p.length-1] && p.push(0),p), [0]);
console.log(code);




这个满足了问题的字面描述。



var a = ['t', 'f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'],
    r = [],
    n = 0;
    a.reduce((p,c) => (p != c ? c == "t" ? n++
                                         : n && (r.push(n),n=0)
                              : c == "t" && n++
                      ,c));
console.log(r);