Как добавить объект внутри массива, присутствующего внутри другого массива objet, на основе другого значения, присутствующего внутри основного объекта - PullRequest
0 голосов
/ 27 мая 2020

У меня есть данные в виде массива объекта, т.е. данных, и я хочу передать sh значение из данных в другой массив объекта, например, catArrObj, на основе аналогичного значения полей внутри двух из них.

catArrObj

catArrObj=[
     {
      name:"one",
      tags:[] 
     }, 
     {
      name:"two",
      tags:[]
     }
    ]

Я хочу указать sh значение на основе имени catArrObj внутри тегов catArrObj, я использую данные для pu sh значение, категории которого совпадают с именем catArrObj.

data

 data= [
        {
            "tag_name": "US",
            "id": 1,
            "categories": "one"
        },
        {
            "tag_name": "US-CA",
            "id": 2,
            "categories": "one"
        },
        {
            "tag_name": "Full Time",
            "id":3,
            "categories": "two"
        }
    ]

logi c

               for(let i=0; i<catArrObj.length; i++){
                for(let index=0; index<data.length; index++){
                    if(catArrObj[i].name === data[index].categories){
                        let singleTag = {                                         
                            name: data[index].categories,
                            value: data[index].tag_name,
                            id: data[index].id,
                            checked: false,
                        }
                        catArrObj[i].tags.push(singleTag)
                    }
            }
           console.log(catArrObj)

Я должен получить требуемый вывод как это

[
     {
      name:"one",
      tags:[
            { 
             checked: false
             id: 1
             name: "one"
             value: "US"
            },
            { 
             checked: false
             id: 2
             name: "one"
            value: "US-CA"
            },
          ] 
     }, 

     {
      name:"two",
      tags:[
            {
             checked: false
             id: 1
             name: "two"
             value: "Full Time"
            }
           ]
     }
]

но я получаю это

 [
     {
      name:"one",
      tags:[
            { 
             checked: false
             id: 1
             name: "one"
             value: "US"
            },
            { 
             checked: false
             id: 2
             name: "one"
            value: "US-CA"
            },
            {
             checked: false
             id: 1
             name: "two"
             value: "Full Time"
            }
          ] 
     },
     {
      name:"two",
      tags:[
            { 
             checked: false
             id: 1
             name: "one"
             value: "US"
            },
            { 
             checked: false
             id: 2
             name: "one"
            value: "US-CA"
            },
            {
             checked: false
             id: 1
             name: "two"
             value: "Full Time"
            }
           ]
     }
 ]

почему все три значения помещаются в оба объекта? Я пробовал много подходов, но не могу получить желаемый результат.

также данные динамические c, это означает, что у меня может быть любое количество объектов внутри него с различными категориями и catArrObj будет иметь объекты, равные уникальным категориям внутри данных.

Ответы [ 3 ]

0 голосов
/ 27 мая 2020

Вы можете сделать это с помощью map:

data= [ { "tag_name": "US", "id": 1, "categories": "one" }, { "tag_name": "US-CA", "id": 2, "categories": "one" }, { "tag_name": "Full Time", "id":3, "categories": "two" } ]
 catArrObj=[ { name:"one", tags:[] }, { name:"two", tags:[] } ];

result = catArrObj.map((elem)=>{
    elem.tags = data.filter(k=>k.categories==elem.name).map(({tag_name, categories, ...rest})=>({...rest, checked:false, value:categories, name:tag_name}));
    return elem
})

console.log(result);
0 голосов
/ 27 мая 2020

Ваш logi c отлично работает со мной после внесения двух изменений:

  1. Я думаю, что идентификатор во втором объекте требуемого вывода должен быть 3 в соответствии с вашими данными

    {
      name: "two",
      tags: [{
        checked: false,
        id: 3,
        name: "two",
        value: "Full Time"
      }]
    }
    
  2. Я думаю, что это должен быть catArrObj [I] .name, но не catArrObj [I] .category, поскольку в catArrObj не существует такой категории категории

    if (catArrObj[i].name === data[index].categories) {
    

Здесь - моя ссылка на JSFiddle для справки.

for (let i = 0; i < catArrObj.length; i++) {
  for (let index = 0; index < data.length; index++) {
  //i think it supposed to be catArrObj[i].name but not catArrObj[i].category since there 
  //isnt category such key existing within catArrObj
    if (catArrObj[i].name === data[index].categories) {
      let singleTag = {
        name: data[index].categories,
        value: data[index].tag_name,
        id: data[index].id,
        checked: false,
      }
      catArrObj[i].tags.push(singleTag);
    }
  }

}
0 голосов
/ 27 мая 2020

ОБНОВЛЕНИЕ : я предпринял попытку ниже, пожалуйста, проверьте это.

https://codesandbox.io/s/nifty-allen-pup2v?file= / src / index. js

В этом скрипте

  for(let i=0; i<catArrObj.length; i++){
                for(let index=0; index<data.length; index++){
                    if(catArrObj[i].category === data[index].categories){
                        let singleTag = {                                         
                            name: data[index].categories,
                            value: data[index].tag_name,
                            id: data[index].id,
                            checked: false,
                        }
                        catArrObj[i].tags.push(singleTag)
                    }
            }

«catArrObj [i] .category» должен быть «catArrObj [i] .name».

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...