多个输入到一个输出
Multiple input to one output
如何将多个输入值处理为一个输出值?
function c(input,val){
return input.indexOf(val)>-1;
}
function result(i){
if(c(i,1) && c(i,2) && c(i,3)){
return "alpha";
}else if(c(i,1) && c(i,2) && !c(i,3)){
return "beta";
}else if(c(i,1) && !c(i,2) && c(i,3)){
return "gamma";
}else if(c(i,1) && !c(i,2)){
return "delta";
}else if(c(i,3)){
return "theta";
}
//..... and so on covering all possible combinations
return null;
}
result([1,2,3]); //output : alpha
result([1,3,2]); //output : alpha
result([1,3,1,1]); //output : gamma
result([1,2,4]); //output : beta
result([3]); //output : theta
数组中的值数可以是 N,但只能来自一组预定义的值
使用这么多组合的正确方法是什么?
根据Condor的回答,下面应该可以完成这项工作。它使用一系列测试来计算结果,并实现"非"测试。如果一个值是"true",它必须出现,如果一个值是"false",它一定不会出现。如果没有提到,它是否在值中并不重要。
重复项不是问题,值被处理,直到一个失败。不过,首先删除重复项可能会加快速度。
结果是通过的第一组测试的名称。
function testValues(values) {
var checks = [
{alpha: {1:true, 2:true, 3:true }},
{beta : {1:true, 2:true, 3:false}},
{gamma: {1:true, 2:false, 3:true }},
{theta: {3:true}}
];
var check, resultName, tests, passed;
// Do checks in sequence
for (var i=0, iLen=checks.length; i<iLen; i++) {
check = checks[i]
// Get name of result to return if the checks pass
for (resultName in check) {
// Make sure result is own property
if (check.hasOwnProperty(resultName)) {
// Passed is true until a fail is found
passed = true;
// Get tests to perform
tests = check[resultName];
// For each value in tests, make sure value exists or doesn't in values
for (var v in tests) {
if (tests.hasOwnProperty(v)) {
// Only test if passed is true
if (passed) {
// Note that indexOf uses === so must have same type
// Property names are always strings so if passing numbers,
// Must convert to numbers
passed = tests[v] === (values.indexOf(+v) != -1);
}
}
}
// If passed tests, return
if (passed) return resultName;
}
}
}
return 'failed all tests...';
}
console.log(testValues([1,2,3])); //output : alpha
console.log(testValues([1,3,2])); //output : alpha
console.log(testValues([1,3,1,1])); //output : gamma
console.log(testValues([1,2,4])); //output : beta
console.log(testValues([3])); //output : theta
如果 Object.keys 与 forEach 一起使用,代码可能会短一点,但上面的内容更清晰一些(也许(,可以重构得更短一些。如果提供了 Array.prototype.indexOf 的填充程序,则上述方法将在 ECMA-262 ed 3 环境中工作。
编辑
如果使用现代功能,则可以稍微简化代码。为旧版浏览器提供支持并不困难:
// These are sufficient to support the function but are not suitable for general use
// Better versions are avaialble at MDN, see links below
if (!Object.keys) {
Object.keys = function(obj) {
var keys = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
}
}
return keys;
};
}
if (!Array.prototype.indeOf) {
Array.prototype.indexOf = function (value) {
for (var i=0, iLen=this.length; i<iLen; i++) {
if (this[i] === value) return i;
}
return -1;
};
}
function testValues(values) {
var checks = [
{alpha: {1:true, 2:true, 3:true }},
{beta : {1:true, 2:true, 3:false}},
{gamma: {1:true, 2:false, 3:true }},
{theta: {3:true}}
];
var check, passed, resultName, tests, testKeys;
for (var i=0, iLen=checks.length; i<iLen; i++) {
check = checks[i]
resultName = Object.keys(check)[0];
passed = true;
tests = check[resultName];
testKeys = Object.keys(tests);
for (var j=0, jLen=testKeys.length; j<jLen && passed; j++) {
passed = tests[testKeys[j]] === (values.indexOf(+testKeys[j]) != -1);
}
if (passed) return resultName;
}
return 'failed all tests...';
}
对象键:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Array.prototype.indexOf: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
如果案例更容易访问,代码也许可以组织得更清晰。例如,alpha
情况可以由一个数组[1,2,3]
形成,该数组将列出代码所依赖的数字和布尔值数组[true,true,true]
该数组将指示相应的数字是否出现。检查可以使用如下函数实现。
function check_case(values,bools){
var Result = true;
for ( var i = 0; i < values.length; i++ ){
Result = Result && ( c(values[i]) == bools[i] );
}
return Result;
}
这规避了必须单独否定c
结果的条件的制定,这使得它们难以遵循和编辑。
这个想法可以更进一步,有一系列案件,这些案件也将包含案件的名称。包含上述前两种情况的数组将如下所示。
[
{
values: [1,2,3],
bools: [true,true,true],
name: 'alpha'
},
{
values: [1,2,3],
bools: [true,true,false],
name: 'beta'
}
]
然后,代码将遍历此数组,为每个索引调用 check_case
,并为第一次命中返回 name
的值。
让你预定义的数组是:- [3,2,1](为了简单起见,我保持简短,这可以扩展到N个元素(
预定义数组作为布尔字符串可以可视化为:- 123
您可以将此数字视为布尔值并创建所需的输出映射:-
示例:- 如果没有数字:- 000 0
如果只有 1 个存在:- 100 4
如果只有 1 和 2 存在:- 110 6
依此类推,可以定义所有必需的布尔组合
因此,对于N个数字,您可以创建所需的所有可能组合的列表
示例:- var definedSet = {"0":"Alpha","1":"beta","2":"gama","3":"x","4":"y","5":"z","6":"a","7":"b"};
现在接受输入并删除重复项并检查位置(数字的位位置并创建一个布尔值并将其映射到定义的集合(
法典:-
function sortAndRemoveDuplicates(arr) {
arr.sort( function(a, b) { return a - b; } );
var copy = arr.slice(0);
arr.length = 0;
for (var i = 0, len = copy.length; i < len; ++i) {
if (i == 0 || copy[i] != copy[i - 1]) {
arr.push(copy[i]);
}
}
return arr;
}
var definedArr = [3,2,1];
var definedSet = {"0":"Alpha","1":"beta","2":"gama","3":"x","4":"y","5":"z","6":"a","7":"b"};
var inputArr=[1,4,3,1,1];
sortAndRemoveDuplicates(inputArr);
var outBooleanValue = 0;
for(var i=0;i<inputArr.length;i++)
{
var numIndex =definedArr.indexOf(inputArr[i]);
if(numIndex!=-1)
{
outBooleanValue+=Math.pow(2,numIndex);
}
}
result =definedSet[outBooleanValue.toString()];
alert(result);
这是工作小提琴:-
http://jsfiddle.net/9tFnn/1/
这是另一个版本,其中不需要预定义的输入,它允许您按照指定的条件给出:-
var definedSet = {"1":"alpha","12":"beta","12!3":"gama","123":"delta"};
$("#defined-set").html(JSON.stringify(definedSet));
var inputArr=[1,2];
$("#input").html(JSON.stringify(inputArr));
$.unique(inputArr);
inputArr.sort();
var outputStr = inputArr.join('');
var regexStr = '';
var loopCounter=0;
for(loopCounter=0;loopCounter<outputStr.length;loopCounter++)
regexStr+='(!''d)*'+outputStr[loopCounter]+'(!''d)*';
regexStr+='$';
//var regexPattern = new RegExp(regexStr);
console.log(regexStr);
for(var currSet in definedSet)
{
//var match = regexPattern.test(currSet);
var match = currSet.search(regexStr);
if(match!=-1)
{
if(currSet==outputStr)
{
$("#result").append("Exact Match::");
}
$("#result").append(currSet+"<br/>");
}
}
这是工作小提琴的链接:-
http://jsfiddle.net/hLUuF/1/
注意:- 这只是用于获得答案的算法的基本原型,可以根据编程需要进行修改。
希望这被证明是有用的。
此解决方案假定输入中元素的顺序并不重要。也就是说,[1, 3, 2]
的输入与[1, 2, 3]
的输入相同。
看起来您要做的是从范围中获取一组可能的输入 (1..n)
,每个输入都可能存在,也可能不存在。换句话说,对于[1, 2, 3, 4]
范围,一个可能的输入是[1, 3]
。或
Out of: [1, 2, 3, 4]
We want: [x, 0, x, 0]
这看起来很像一个二进制数,特别是如果我们颠倒顺序。所以我们真正需要做的就是
- 将我们的输入转换为二进制数
- 使用该二进制数作为预定义值查找表的索引
对于第一部分,我们需要做的就是遍历输入值并将适当的位OR
在一起。这也会自动处理任何重复项。
for (i=0;i<input_array.length;i++)
{
num = num | (1 << (input_array[i] - 1));
}
那里- 1
是因为我们的序列从1
而不是0
开始。因此,输入 4
将导致1000
,输入 2
将导致0010
。 OR
将它们放在一起会得到 1010
或 10(十进制(。
现在 num 包含我们事先设置的表中的索引:
values[0] = "alpha"; // Corresponding to input []
values[1] = "beta"; // Corresponding to input [1]
...
values[10] = "gamma"; // Corresponding to input [4, 2] - remember, it's reversed
...
values[15] = "theta"; // Corresponding to input [4, 3, 2, 1]
- 一个ajax循环有两个输出错误innerHTML
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- Javascript未在其中一个变量上输出0
- 它在另一个函数中嵌套后不会输出文本
- 如何只输出一个SQL结果
- 从一个文本框执行代码,并在另一个文本框中以 HTML 显示输出
- 从引导程序图标十六进制值输出一个符号
- 我有一个mysql的输入文本字段.那么,如何通过ajax从数据库中输出json表呢
- Jquery将最后一个输出作为值
- 将7个图像组合为一个,一个在另一个之上,并输出为单个图像
- rxjs:重置为流,只得到一个输出
- 为什么 async.series 只产生一个输出
- 使用两个文本区域(一个输入和一个输出)和JavaScript创建一个字母排序器
- 在一个输出中针对多个链接定位来自链接的文本值
- 我想使用setInterval()每1秒更新一个输出列表,但它会得到无限循环输出
- angularjs ng在两个级别上重复,但只有一个输出
- 有人能解释一下下面javascript代码的最后一个输出是如何产生的吗
- 多个输入到一个输出
- 需要添加一个输出的图像,一个隐藏的id,和checkout按钮到这个php/ajax脚本和我卡住
- 用于下一个输出的明文