从javascript中的arrray中选择

时间:2017-03-23 13:23:19

标签: javascript

我是javascript的新手,希望能够在两个数组中的不同字符串之间进行逻辑OR,这样如果user-inputA等于array1中的字符串,并且user-inputB等于array2中的字符串它打印两个字符串。

每个阵列有4个字符串。

我已经弄清楚如何只使用两个变量而不是数组,并使用一堆if语句如下:

var fname = prompt(), sname = prompt()
if (fname === "john" && sname === "doe")
{alert("Hello john doe")}
else if (fname === "dennis" && sname === "richie")
{alert("Hello dennis richie")}
else if (fname === "tim" && sname === "lee")
{alert("Hello tim lee")}
else if (fname === "bill" && sname === "gates")
{alert("Hello bill gates")}
else
{alert("name not found")}

但我现在想使用数组而不是只有一个sname和一个fname。也许是这样的:

if ([0] in fname && [0] in sname) {alert(fname[0] + " " + sname[0])}
if ([1] in fname && [1] in sname) {alert(fname[1] + " " + sname[1])}
if ([2] in fname && [2] in sname) {alert(fname[2] + " " + sname[2])}
if ([3] in fname && [3] in sname) {alert(fname[3] + " " + sname[3])}
//each array has 4 strings

我希望尽可能减少这一点(就我已经知道/将要学习的关键词和语法而言)而不是有人完整地重写我的代码,尽管他们可能会做得更好。 也许theres就像一个新关键字才能做到这一点? 我听说过indexof()但是不能判断它是否合适。

3 个答案:

答案 0 :(得分:3)

如果你有一个数组,例如

var a = ["doe", "richie", "lee", "gates"];

...您可以通过a.indexOf(theString) != -1或(在较新的JavaScript引擎上)a.includes(theString)检查字符串是否在该数组中。

所以,尽可能少地改变:

var fnames = ["john", "dennis", "tim", "bill"];
var snames = ["doe", "richie", "lee", "gates"];
var fname = prompt(), sname = prompt();
if (fnames.indexOf(fname) != -1 && snames.indexOf(sname) != -1) {
    alert("Hello " + fname + " " + sname);
} else {
    alert("Name not found");
}

(或者,我们可以再次使用if (fnames.includes(fname) && snames.includes(sname))。)

当然,这会很高兴地提醒"Hello tim richie"

如果您想检查匹配对,那么:

var fnames = ["john", "dennis", "tim", "bill"];
var snames = ["doe", "richie", "lee", "gates"];
var fname = prompt(), sname = prompt();
var fnameIndex = fnames.indexOf(fname)
if (fnameIndex != -1 && snames.indexOf(sname) == fnameIndex) {
    alert("Hello " + fname + " " + sname);
} else {
    alert("Name not found");
}

这要求数组的顺序相同。

如果您正在进行配对匹配,最好使用单个对象数组和Aray#some

var names = [
  {fname: "john", sname: "doe"},
  {fname: "dennis", sname: "richie"},
  {fname: "tim", sname: "lee"},
  {fname: "bill", sname: "gates"}
];
var fname = prompt(), sname = prompt();
if (names.some(function(entry) {
    return entry.fname == fname && entry.sname == sname;
})) {
    alert("Hello " + fname + " " + sname);
} else {
    alert("Name not found");
}

......使用ES2015的箭头功能看起来更清洁:

const names = [
  {fname: "john", sname: "doe"},
  {fname: "dennis", sname: "richie"},
  {fname: "tim", sname: "lee"},
  {fname: "bill", sname: "gates"}
];
const fname = prompt(), sname = prompt();
if (names.some(e => e.fname == fname && e.sname == sname)) {
    alert("Hello " + fname + " " + sname);
} else {
    alert("Name not found");
}

旁注:男人的名字是Tim Berners-Lee,而不是Tim Lee。仅使用带连字符的部分名称与完全使用其他名称一样不正确。 : - )

答案 1 :(得分:0)

使用Array.find()

的解决方案

var userInput = [prompt(),
  prompt()
];
var names = [
  ["john", "doe"],
  ["dennis", "richie"],
  ["tim", "lee"],
  ["bill", "gates"]
];

var print = names.find(function(e) {
  if (e[0] == userInput[0] && e[1] == userInput[1]) {
    return e;
  }
});

if (print != undefined) {
  alert("hello " + userInput[0] + " " + userInput[1]);
} else {
  alert("name not found");
}

答案 2 :(得分:0)

另一种写作方式,虽然我知道你并不想完全重写你的代码。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
       vc:minVersion="1.1">

<xs:element name="root" type="root"></xs:element>

<xs:complexType name="root">
    <xs:sequence>
        <xs:element name="P1Message"
            type="p1Message">
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="p1Message">
    <xs:sequence>
        <xs:element name="Hdr" type="hdr"></xs:element>
        <xs:element name="Inf" type="inf"></xs:element>         
    </xs:sequence>
</xs:complexType>

<xs:complexType name="hdr">
    <xs:sequence>
        <xs:element name="I1Agt" type="i1Agt"></xs:element>
        <xs:element name="SequenceNum" type="xs:string"></xs:element>
        <xs:element name="SessionNum" type="xs:string"></xs:element>        
        <xs:element name="MsgTyp" type="xs:string"></xs:element>                
        <xs:element name="IntComment" type="xs:string"></xs:element>
    </xs:sequence>  
<xs:assert test="LclInstrm or not(MsgTyp = '103')"/>    
</xs:complexType>

<xs:complexType name="i1Agt">
    <xs:sequence>
        <xs:element name="FinInstnId" type="finInstnId"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="finInstnId">
    <xs:sequence>
        <xs:element name="B1" type="xs:string"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="inf">
    <xs:sequence>           
        <xs:element name="PmtTpInf" type="pmtTpInf"></xs:element>           
    </xs:sequence>
</xs:complexType>

<xs:complexType name="pmtTpInf">
    <xs:sequence>
        <xs:element name="LclInstrm" type="xs:string" minOccurs="0" maxOccurs="1"></xs:element>
        <xs:element name="Svc" type="svc"></xs:element>
    </xs:sequence>     
</xs:complexType>

<xs:complexType name="svc">
    <xs:sequence>
        <xs:element name="Cd" type="xs:string"></xs:element>
    </xs:sequence>
</xs:complexType>
</xs:schema>