Javascript任务(完成微信100元奖励),不明白的请加微信13825600069

wang_jinhai 2020-12-11 10:30:02
bxxx代表td的id,感觉就像EXCEL加减公式,要求写一个function,把字符串表示的td的数字加减起来。
字符串公式有5种形式



str1="=b199"
str2="=b142-b143"
str3="=c18+c78+c84+c125"
str4="=b261+b262+b263+b264+b265+b266+b267+b268+b269+b270+b271+b272+b273-b274"
str5="=b2+......+b17"


<table>
<tr>
<td>序号</td><td>值</td><td>公式</td>
</tr>
<tr>
<td>1</td><td id=b1>值</td><td id=c1></td>
</tr>
<tr>
<td>2</td><td id=b2>值</td><td id=c2></td>
</tr>
…………
<tr>
<td></td><td id=b1000>值</td><td id=c1000 class='sum'>=c18+c78+c84+c125</td>
</tr>
</table>
...全文
1203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2020-12-12
  • 打赏
  • 举报
回复
支持td中是负数 td是空的时候按0处理了

<table id="tab">
	<tr>
		<td id="a1">70</td>
		<td id="a2">-50</td>
		<td id="a3">20</td>
		<td id="a4">10</td>
		<td id="a5">=a1-a2-b5</td>
	</tr>
	<tr>
		<td id="b1">-10</td>
		<td id="b2"></td>
		<td id="b3">60</td>
		<td id="b4">40</td>
		<td id="b5">=b1+b2</td>
	</tr>
	<tr>
		<td id="c1">50</td>
		<td id="c2">70</td>
		<td id="c3">60</td>
		<td id="c4">=a1+.....+a4</td>
		<td id="c5">=c1+...+c4</td>
	</tr>
</table>
<script type="text/javascript">
function calc(obj) {
	var str = obj.innerText;
	if (/^\s*$/.test(str))
		return 0;
	if (str[0]=="=") {
		obj.innerText = eval(str.slice(1).replace(/([a-z]+)(\d+)([\+\-\*\/])\.{3,}\3\1(\d+)/ig,function (s,a,b,c,d) {
			var arr = [];
			b = parseInt(b, 10);
			d = parseInt(d, 10);
			for (var i = b; i <= d; i++)
				arr.push(a+i);
			return arr.join(c);
		}).replace(/[a-z]+\d+/ig,function (s) {
			return "("+calc(document.getElementById(s))+")";
		}));
	}
	return obj.innerText;
}

var td = document.querySelectorAll("#tab td");
for (var i = 0, len = td.length; i < len; i++) {
	calc(td[i]);
}
</script>

wang_jinhai 2020-12-11
  • 打赏
  • 举报
回复
一个函数需要同时处理这5种情况,正则表达式不太熟,搞不出来。 str1="=b199" str2="=b142-b143" str3="=c18+c78+c84+c125" str4="=b261+b262+b263+b264+b265+b266+b267+b268+b269+b270+b271+b272+b273-b274" str5="=b2+......+b17"
  • 打赏
  • 举报
回复
不是挺简单的吗,会点js都能写出来吧,id按顺序来的1~100,循环获取dom,取出td的值转换为number 进行加减
泡泡鱼_ 2020-12-11
  • 打赏
  • 举报
回复

const str1 = "=b199";
const str2 = "=b142-b143";
const str3 = "=c18+c78+c84+c125";
const str4 = "=b261+b262+b263+b264+b265+b266+b267+b268+b269+b270+b271+b272+b273-b274";

function evalCalc(str) {
    str = str.replace(/[A-Za-z]|=/g, '');
    return eval(str);
};
const res1 = evalCalc(str1);
const res2 = evalCalc(str2);
const res3 = evalCalc(str3);
const res4 = evalCalc(str4);
console.log(res1);
console.log(res2);
console.log(res3);
console.log(res4);
天际的海浪 2020-12-11
  • 打赏
  • 举报
回复

<table id="tab">
	<tr>
		<td id="a1">10</td>
		<td id="a2">50</td>
		<td id="a3">20</td>
		<td id="a4">10</td>
		<td id="a5">=a1+a2+b5</td>
	</tr>
	<tr>
		<td id="b1">50</td>
		<td id="b2">70</td>
		<td id="b3">60</td>
		<td id="b4">40</td>
		<td id="b5">=b1+b2</td>
	</tr>
	<tr>
		<td id="c1">50</td>
		<td id="c2">70</td>
		<td id="c3">60</td>
		<td id="c4">=a1+.....+a4</td>
		<td id="c5">=c1+...+c4</td>
	</tr>
</table>
<script type="text/javascript">
function calc(obj) {
	var str = obj.innerText;
	if (str[0]=="=") {
		obj.innerText = eval(str.slice(1).replace(/([a-z]+)(\d+)([\+\-\*\/])\.{3,}\3\1(\d+)/ig,function (s,a,b,c,d) {
			var arr = [];
			b = parseInt(b, 10);
			d = parseInt(d, 10);
			for (var i = b; i <= d; i++)
				arr.push(a+i);
			return arr.join(c);
		}).replace(/[a-z]+\d+/ig,function (s) {
			return calc(document.getElementById(s));
		}));
	}
	return obj.innerText;
}

var td = document.querySelectorAll("#tab td");
for (var i = 0, len = td.length; i < len; i++) {
	calc(td[i]);
}
</script>
weixin_50944805 2020-12-11
  • 打赏
  • 举报
回复

// 用正则
var str6 = '=b1+b2/c1*c2'
			console.log(onSum(str6))
			function onSum(str){
				if(str[0] != '='){
					return str
				}else{
					var r = /[*+-/]/g
					str = str.substring(1)
					var types = str.match(r)
					types ? types.push('') : types = ['']
					var data = str.split(r).map(id => document.getElementById(id).innerText ).map((v,i) => v+types[i])
					return eval(data.join(''))
				}
			}

嘴哥臭鼬 2020-12-11
  • 打赏
  • 举报
回复
挺简单的,不要删我,不是灌水,就是简单,费脑细胞而已
Hello World, 2020-12-11
  • 打赏
  • 举报
回复
简单的处理:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>formula test</title>
</head>
<body>
    <div id='b261'>623</div>
    <div id='b262'>786</div>
    <div id='b263'>546</div>
    <div id='b264'>136</div>
    <div id='b265'>627</div>
    <div id='b266'>401</div>
    <div id='b267'>313</div>
    <div id='b268'>139</div>
    <div id='b269'>265</div>
    <div id='b270'>296</div>
    <div id='b271'>821</div>
    <div id='b272'>940</div>
    <div id='b273'>530</div>
    <div id='b274'>946</div>
</body>
</html>
<script>
    var f = '=b261+b262+b263+b264+b265+b266+b267+b268+b269+b270+b271+b272+b273-b274+3600';
    function cal(formula) {
        //如果输入带的等于号则先去掉
        if (formula.substring(0, 1) === '=') {
            formula = formula.substring(1);
        }
        //取得各计算单元
        var cells = formula.split(/[*+-/]/g);
        //拆分操作符
        var operators = formula.match(/[*+-/]/g);
        //第一个单元
        formula = val(cells[0]);
        //其他单元拼接操作符
        for (var i = 1; i < cells.length; i++) {
            formula += operators[i - 1] + val(cells[i]);
        }
        //输出组合后的字符串
        console.log(formula);
        //输出计算结果
        console.log(eval( formula ));
    }
    function val(cell) {
        //以字母开头的算作是元素的id,如果有其他的可以修改判断逻辑
        //例如函数,会带括号……
        if (/[A-Za-z]/.test(cell)) {
            var dom = document.getElementById(cell);
            return dom.innerText;
        } else {
            return cell;
        }
    }
    cal(f);
</script>
泡泡鱼_ 2020-12-11
  • 打赏
  • 举报
回复
1:先把字母和=号替换为空 2:eval()就直接是结果
weixin_50944805 2020-12-11
  • 打赏
  • 举报
回复

// 现在支持 加、减、乘、除
var str6 = '=b1+b2/c1*c2'
			alert(strSplit(str6))
			// console.log()
			function strSplit(str){
				if(str[0] != '='){
					return str
				}
				var name_id = ''
				var sum = ''
				var types = ['+', '-', '*', '/'] // 在这里修改支持的算法
				for(var i = 1; i < str.length; i++){
					if(types.indexOf(str[i]) != -1){
						sum += getNum(name_id) + str[i]
						name_id = ''
					}else{
						name_id += str[i]
					}
					if(i == str.length - 1){
						sum += getNum(name_id)
					}
				}
				return eval(sum)
			}
			
			function getNum(id){
				return document.getElementById(id).innerText
			}

锟斤拷锟斤拷 2020-12-11
  • 打赏
  • 举报
回复
split()一下不久把这些b什么玩意都取出来了嘛

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧