У меня есть JSON, как показано ниже

[
  {
    "name": "Mike",
    "incentives": "23.45",
    "id": "1"
  },
  {
    "name": "Larsen",
    "incentives": "34.78",
    "id": "2"
  },
  {
    "name": "Steve",
    "incentives": "26.78",
    "id": "3"
  }
]

Мне нужно вставить новый объект JSON в массив JSON, если идентификатор не существует внутри объекта JSON

Попробовал как этот способ и работает, любой лучший способ сделать это

$(document).ready(function() {

var idsarray = [];

  var test = [
  {
    "name": "Mike",
    "incentives": "23.45",
    "id": "1"
  },
  {
    "name": "Larsen",
    "incentives": "34.78",
    "id": "2"
  },
  {
    "name": "Steve",
    "incentives": "26.78",
    "id": "3"
  }
];

for(var i=0;i<test.length;i++)
{
idsarray.push(test[i].id)
}

var newobj =  {
    "name": "RAM",
    "incentives": "56.78",
    "id": "4"
  }

  var newid = newobj.id;

if(jQuery.inArray(newid, idsarray) !== -1)
{
test.push(newobj)
}

alert(test.length)

});
0
Pawan 20 Авг 2018 в 14:01

3 ответа

Лучший ответ

Ваше состояние неверно. Это должно быть jQuery.inArray(newid, idsarray) === -1, потому что операция jQuery.inArray(newid, idsarray) вернет -1, если newid отсутствует в idsarray. Итак, это то, что вам нужно, чтобы проверить уникальность в idsarray.

Вы также можете использовать операцию indexOf() для того же. idsarray.indexOf(newid) === -1 .

Код ОП

$(document).ready(function() {

  var idsarray = [];
  var test = [{
      "name": "Mike",
      "incentives": "23.45",
      "id": "1"
    },
    {
      "name": "Larsen",
      "incentives": "34.78",
      "id": "2"
    },
    {
      "name": "Steve",
      "incentives": "26.78",
      "id": "3"
    }
  ];

  for (var i = 0; i < test.length; i++) {
    idsarray.push(test[i].id)
  }

  var newobj = {
    "name": "RAM",
    "incentives": "56.78",
    "id": "4"
  }

  var newid = newobj.id;
  if (jQuery.inArray(newid, idsarray) === -1) {
    test.push(newobj)
  }
  alert(test.length)

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

ИСПОЛЬЗОВАНИЕ indexOf()

$(document).ready(function() {

  var idsarray = [];
  var test = [{
      "name": "Mike",
      "incentives": "23.45",
      "id": "1"
    },
    {
      "name": "Larsen",
      "incentives": "34.78",
      "id": "2"
    },
    {
      "name": "Steve",
      "incentives": "26.78",
      "id": "3"
    }
  ];

  for (var i = 0; i < test.length; i++) {
    idsarray.push(test[i].id)
  }

  var newobj = {
    "name": "RAM",
    "incentives": "56.78",
    "id": "4"
  }

  var newid = newobj.id;
  if (idsarray.indexOf(newobj) === -1) {
    test.push(newobj)
  }
  alert(test.length)

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
1
Ankit Agarwal 20 Авг 2018 в 11:10

inArray медленно. Если вы сделаете это один раз, это не самая плохая вещь, но find или some в исходном массиве будет лучше:

if (!test.some(o => o.id == newid)) {
  test.push(newobj)
}

Однако, если вы делаете это часто, гораздо лучше сделать набор, так как проверка членства в наборе выполняется очень быстро:

let idset = new Set();
...
if (!idset.has(newid)) {
  test.push(newobj);
  idset.add(newid);
}

Вы также можете использовать Map (или даже простой старый объект) для объединения двух:

let test = new Map();
...
if (!test.has(newid)) {
    test.set(newobj);
}

Вы можете получить массив из Map используя test.values().

1
Amadan 20 Авг 2018 в 11:09

Вы можете избежать использования другого array, который содержит id объектов. Вы можете использовать встроенную функцию Array.some проверить наличие и нажать соответственно.

var test = [{"name":"Mike","incentives":"23.45","id":"1"},{"name":"Larsen","incentives":"34.78","id":"2"},{"name":"Steve","incentives":"26.78","id":"3"}];
var newobj = {"name":"RAM","incentives":"56.78","id":"4"};
if(!test.some(({id}) => id == newobj.id)) test.push(newobj);
console.log(test);

Кроме того, если ваша операция push будет довольно частой, то каждый раз зацикливание будет влиять на производительность. Вместо массива ids вы можете сохранить map или set идентификаторов, поскольку сложность поиска будет O (1).

var test = [{"name":"Mike","incentives":"23.45","id":"1"},{"name":"Larsen","incentives":"34.78","id":"2"},{"name":"Steve","incentives":"26.78","id":"3"}];
var newobj = {"name":"RAM","incentives":"56.78","id":"4"};
var ids = test.reduce((a, {id}) => Object.assign(a, {[id]:id}), {});
if(!ids[newobj.id]) {
   test.push(newobj);
   ids[newobj.id] = newobj.id;
}
console.log(test);
0
Nikhil Aggarwal 20 Авг 2018 в 11:45
51929325