我一直在四处寻找,但不确定我正在寻找合适的东西。
说我有这个
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)
假设我完全错过了某种非常明显的方式!
答案 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)
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 function,Ternary operator和Logical 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);