Помещение объектов в массив - сохранение повторяющихся результатов - PullRequest
0 голосов
/ 07 мая 2020

Я просто пытаюсь собрать sh 2 разных столбца (name and sys_id) данных в массив. У меня полностью 38 records с разными данными, там есть несколько дубликатов.

Когда я пытаюсь вставить в качестве объектов, он 38 раз вставляет только одну запись.

0: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
1: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
2: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
3: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
4: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
5: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
6: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
7: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
8: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
9: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
10: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}
11: {name: "Incident Request", sys_id: "3ee543f61b363740f713ed7b2f4bcbc0"}

Я пробовал ниже скрипт, в item я получу все сведения о записи.

var arr=[];
var obj = {};

while(item.next()){
    obj["name"] = item.cat_item.name.toString();
    obj["sys_id"] = item.cat_item.sys_id.toString();
    arr.push(data.obj);
}

если я помещаю sh только item.cat_item.name.toString() в массив напрямую, я получаю правильные данные.

0: "Manage AAA Devices"
1: ""
2: "Manage AAA - ISE Admin Functions"
3: "Manage AAA Devices"
4: "Manage AAA - ISE Admin Functions"
5: "SNOW Change Request"
6: ""
7: "Manage AAA - ISE Admin Functions"
8: "Manage AAA - ISE Admin Functions"
9: "Incident Request"
10: "Manage AAA - ISE Admin Functions"
11: "Incident Request"
12: "Incident Request"
13: "Server Lifecycle(EOL)"
14: "Incident Request"
15: "Server Lifecycle(EOL)"
16: "Incident Request"
17: "Incident Request"

только проблема возникает при вставке как объекта. Что-то не так с моим кодом? Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вам необходимо создать новый obj объект для каждой итерации, поэтому его объявление и инициализация должны go внутри l oop:

const data = [
  { name: "Incident Request", sys_id: 1 },
  { name: "Incident Request", sys_id: 2 },
  { name: "Incident Request", sys_id: 1 },
  { name: "Incident Request", sys_id: 4 },
  { name: "Incident Request", sys_id: 2 },
  { name: "Incident Request", sys_id: 1 },
  { name: "Incident Request", sys_id: 2 },
  { name: "Incident Request", sys_id: 3 },
];

const arr = [];

data.forEach((item) => {
  const name = item.name.toString();
  const sys_id = item.sys_id.toString();
  
  // Check if there's already an entry for this `sys_id` and do nothing in that case:
  if (arr.find(cursor => cursor.sys_id === sys_id)) return;
  
  // Here we are not reusing a single object, but creating a new one on each iteration:
  arr.push({ name, sys_id });
});

console.log(arr.map(({ name, sys_id }) => `${ name } - ${ sys_id }`));
.as-console-wrapper {
  max-height: 100% !important;
}

В противном случае вы всегда обновляете один и тот же объект и добавляете его на дополнительную позицию в arr. Поскольку все позиции ссылаются на один и тот же объект, каждое обновление, которое вы выполняете для него, влияет на все из них, поэтому вы будете видеть только значения последней итерации, повторяющиеся несколько раз:

const data = [
  { name: "Incident Request", sys_id: 1 },
  { name: "Incident Request", sys_id: 2 },
  { name: "Incident Request", sys_id: 3 },
  { name: "Incident Request", sys_id: 4 },
  { name: "Incident Request", sys_id: 5 },
  { name: "Incident Request", sys_id: 6 },
  { name: "Incident Request", sys_id: 7 },
  { name: "Incident Request", sys_id: 8 },
];

const arr = [];
const obj = {};

data.forEach((item) => {
  // Update the existing object (always the same object):
  obj.name = item.name.toString(),
  obj.sys_id = item.sys_id.toString(),

  // And add it one more time to the array:
  arr.push(obj);
});

console.log(arr.map(({ name, sys_id }) => `${ name } - ${ sys_id }`));
.as-console-wrapper {
  max-height: 100% !important;
}
1 голос
/ 07 мая 2020

Метод next () возвращает объект с двумя свойствами: значение, выполнено

var arr=[];
var obj = {};
var index = item.next();

while (!index.done) {
    obj["name"] = index.cat_item.name.toString();
    obj["sys_id"] = index.cat_item.sys_id.toString();
    arr.push(data.obj);
    index = item.next();
}
1 голос
/ 07 мая 2020

Вы ссылаетесь на один и тот же объект на каждой итерации и просто меняете его атрибуты. Попробуйте создать новый объект внутри while l oop.

var arr=[];

while(item.next()){
    var obj = {};
    obj["name"] = item.cat_item.name.toString();
    obj["sys_id"] = item.cat_item.sys_id.toString();
    arr.push(data.obj);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...