如果未定义则推送新对象并在可用时忽略

Push new object if it's undefined and ignore when it is available

我想将新对象推送到 JSON 数组(如果尚不可用),如果可用则忽略它。例如,如何在第二次单击按钮时忽略此代码中的登录:

var things = [];

$("#button").click(function(){
things[0]["id456"] != undefined ? console.log("ignored") : things.push({"id456":"clicked"});
$("#output").text(JSON.stringify(things));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='output'></div>
<button id="button">
Click
</button>

我知道我可以做这样的事情:

var strThings = JSON.stringify(things);
var available = strThings.search("id456");
available === -1 ? things.push({"id456":"clicked"}) : console.log("ignored");

但我认为这不是个好主意。

使用Array#some():

var things = [];

$("#button").click(function() {
  things.some(thing => thing.id456 !== undefined) ? console.log("ignored") : things.push({
    "id456": "clicked"
  });
  $("#output").text(JSON.stringify(things));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='output'></div>
<button id="button">Click</button>

但是,如果您需要我的建议,请不要尝试一次性完成。这些神奇的东西叫做 if and else statements:

var things = [];

$("#button").click(function() {
  let containsId456 = things.some(
    thing => thing.id456 !== undefined
  );

  if (containsId456) {
    console.log("ignored");
  } else {
    things.push({"id456": "clicked"});
  }
  $("#output").text(JSON.stringify(things));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='output'></div>
<button id="button">Click</button>

但最后,除非我遗漏了什么,否则使用 Map 或用作 ID 字典的对象会更容易:

var things = new Map();

$("#button").click(function() {
  if (things.has("id456")) {
    console.log("ignored");
  } else {
    things.set("id456", "clicked");
  }
  $("#output").text(JSON.stringify([...things]));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='output'></div>
<button id="button">Click</button>