我怎么知道对象何时已进入我的数组

时间:2018-02-09 02:29:34

标签: javascript arrays node.js object

首先,请原谅我的英语。我会尽力解释我能做到的最好的事情。

我想开发一款多米诺骨牌游戏机。

我将所有多米诺骨牌存储到名为dominoes的数组中。

function createNewDominoes(dominoes) {
  newDomino = {
    a: Math.floor((Math.random() * 7) - 0),
    b: Math.floor((Math.random() * 7) - 0),
    tipo: null
  }

  newDominoFlipped = {
    a: nuevaFicha.b,
    b: nuevaFicha.a,
    tipo: null
  }
  console.log(nuevaFicha, nuevaFichaVolteada)

  if ((includes(dominoes, newDomino)) || (includes(dominoes, newDominoFlipped))) {
    console.log("Element already exist")
  } else {
    array.push(nuevaFicha)
  }
}

我使用的是Node.js,我在app.js文件中包含了array-includes模块,它允许我检查我的数组元素。

问题是,当我得到数组时,函数返回28个元素,这没关系,但有些是重复的。例如:

  [ { a: 3, b: 0, tipo: null },
  { a: 5, b: 2, tipo: null },
  { a: 1, b: 4, tipo: null },
  { a: 1, b: 6, tipo: null },
  { a: 2, b: 4, tipo: null },
  { a: 4, b: 2, tipo: null },
  { a: 4, b: 2, tipo: null },
  { a: 3, b: 3, tipo: null },
  { a: 5, b: 5, tipo: null },
  { a: 3, b: 4, tipo: null },
  { a: 0, b: 6, tipo: null },
  { a: 6, b: 0, tipo: null },
  { a: 4, b: 4, tipo: null },
  { a: 6, b: 3, tipo: null },
  { a: 5, b: 2, tipo: null },
  { a: 3, b: 4, tipo: null },
  { a: 3, b: 5, tipo: null },
  { a: 2, b: 3, tipo: null },
  { a: 3, b: 4, tipo: null },
  { a: 3, b: 3, tipo: null },
  { a: 5, b: 3, tipo: null },
  { a: 0, b: 1, tipo: null },
  { a: 2, b: 2, tipo: null },
  { a: 0, b: 3, tipo: null },
  { a: 2, b: 3, tipo: null },
  { a: 4, b: 4, tipo: null },
  { a: 0, b: 4, tipo: null },
  { a: 5, b: 1, tipo: null } ]

我需要获得所有28张多米诺骨牌,但它们不能重复或翻转重复。

希望你能帮助我

2 个答案:

答案 0 :(得分:0)

编写自己的函数,看看多米诺骨牌是否相等。然后使用Array.some方法查看是否有任何多米诺骨牌符合该条件:

function parseUserDate($input, $allow_zero = false) {
    if (!is_string($input)) {
        return $input === null ? null : false;
    }
    $input = preg_split('/\\D+/', $input, null, PREG_SPLIT_NO_EMPTY);
    if (!$input) {
        return null;# no date
    }
    if (count($input) == 3) {
        list($od, , $oy) = $input;
        if (strlen($od) > 2 && strlen($oy) < 3) {# assume ISO
            $oy = $od;
            $input = array_reverse($input);
        }
        $intify = function($dig) {
            return (int) ltrim($dig, '0');# prevent octals
        };
        list($d, $m, $y) = array_map($intify, $input);
        if (strlen($oy) < 3) {
            $current_year = date('Y');
            $current_year_2 = $intify(substr($current_year, -2));
            $diff = $y - $current_year_2;
            if ($diff > 50) {
                $diff -= 100;
            }
            elseif ($diff < -50) {
                $diff += 100;
            }
            $y = $diff + $current_year;
        }
        if (
            ($allow_zero && $d == 0 && $m == 0 && $y == 0)
            || checkdate($m, $d, $y)# murrican function
        ) {
            return sprintf('%04d-%02d-%02d', $y, $m, $d);
        }
    }
    return false;# invalid date
}

然后使用它来代替const arr = [{ a: 3, b: 0, tipo: null }] const same = {a: 3, b: 0, tipo: null}; const reverse = {a: 0, b: 3, tipo: null}; const diff = {a: 4, b: 0, tipo: null}; function dominoEqual(d1, d2) { if (d1.tipo !== d2.tipo) return false; return (d1.a === d2.a && d1.b === d2.b) || (d1.a === d2.b && d1.b === d2.a); } console.log(arr.some(d => dominoEqual(d, same))) // repeated console.log(arr.some(d => dominoEqual(d, reverse))) // repeated but reversed console.log(arr.some(d => dominoEqual(d, diff))) // not repeated来检查重复项:

includes

答案 1 :(得分:0)

您必须创建自定义功能以检查重复项。每次创建新对象时,都不会满足function containsItemOrFlippedItem(list, item) { return list.some(function(current) { return (current.a === item.a && current.b === item.b) || (current.a === item.b && current.b === item.a); }); } function createNewDominoes(dominoes) { var newDomino = { a: Math.floor((Math.random() * 7) - 0), b: Math.floor((Math.random() * 7) - 0), tipo: null }; if (containsItemOrFlippedItem(dominoes, newDomino)) { console.log("Element already exist"); } else { dominoes.push(newDomino); } } 函数。你可以写一个这样的函数:

some()

这里我使用了Array的some()函数。在MDN查看<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true" scan="true" scanPeriod="30 seconds"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <target>System.out</target> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern> %-4relative [%thread] %-5level %logger - %msg%n </pattern> </encoder> </appender> <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> <target>System.err</target> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> <encoder> <pattern> %-4relative [%thread] %-5level %logger - %msg%n </pattern> </encoder> </appender> <root level="${LOGBACK_ROOT_LEVEL:-INFO}"> <appender-ref ref="STDOUT" /> <appender-ref ref="STDERR" /> </root> </configuration> 的文档。我希望这可以帮助你!!