Chciałbym wiedzieć, jak zmienić obiekt tablicy na obiekt zagnieżdżony w javascript. Mam list jako obiekt tablicy, jak przekonwertować na obiekt zagnieżdżony

function nestedobj(arrlist){
  var result ={};
  result.list1 = arrlist[0];
  result.list2 = arrlist[1]
  return list;
}


var list= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"}
]

var list1= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"},
  {id: 3, cn: "MY"}
]

var listobj = this.nestedobj(list);
var listobj1 = this.nestedobj(list1);

console.log(listobj)
console.log(listobj1)

Oczekiwany wynik

{
  "list1":{"id": 1, "cn": "SG"},
  "list2":{"id": 2, "cn": "TH"}
}

{
  "list1":{"id": 1, "cn": "SG"},
  "list2":{"id": 2, "cn": "TH"},
  "list3":{"id": 3, "cn": "MY"}
}
4
miyavv 3 kwiecień 2020, 12:02

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Array#reduce metoda (lub prosta pętla) do wygenerowania obiektu, w którym właściwość id lub indeks mogą zostać użyte do wygenerowania nazwy właściwości.

var list = [{id: 1,    cn: "SG"  },  {    id: 2,    cn: "TH"  }]

var list1 = [{    id: 1,    cn: "SG"  },  {    id: 2,    cn: "TH"  },  {    id: 3,    cn: "MY"  }]

function convert(arr) {
  // iterate over the array
  return arr.reduce((obj, o, i) => {
    // define the property
    obj[`list${o.id}`] = o; 
    // or with index obj[`list${i + 1}`] = o;
    // return object reference for next call
    return obj;
    // set initial value as empty object to keep the result
  }, {})
}

// or with simple loop
function convert1(arr) {
  const result = {};
  for (let o of arr)
    result[`list${o.id}`] = o;
  return result
}

console.log(convert(list));
console.log(convert(list1));

console.log(convert1(list));
console.log(convert1(list1));
5
Pranav C Balan 3 kwiecień 2020, 09:17

// Zapętl kolekcję:

var list = [
      { id: 1, cn: "SG" },
      { id: 2, cn: "TH" }
    ];
    
    var list1 = [
      { id: 1, cn: "SG" },
      { id: 2, cn: "TH" },
      { id: 3, cn: "MY" }
    ];
    
    function nestedobj2(list) {
      let result = {};
      for (const v of list) {
        result["list" + v.id] = v;
       }
     return result;
    }

var listobj = nestedobj2(list);
console.log("%j", listobj);
listobj = nestedobj2(list1);
console.log("%j", listobj);
   
   function nestedobj(list) {
      return list.reduce((x, data) => {
        x["list" + data.id] = data;
        return x;
      }, {});
    }
    
     listobj = nestedobj(list);
    console.log("%j", listobj)
    listobj = nestedobj(list1);
    console.log("%j", listobj)
.as-console-row {color: blue!important}
0
xdeepakv 3 kwiecień 2020, 09:17

Jeśli liczba po list jest porządkową pozycją elementu plus jeden

var nestedobj = a => Object.fromEntries(Object.entries(a).map(([k, v]) => [`list${+k+1}`, v]));

var list= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"}
]

var list1= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"},
  {id: 3, cn: "MY"}
]

var listobj = nestedobj(list);
var listobj1 = nestedobj(list1);
console.log(listobj)
console.log(listobj1)

Jeśli jednak liczba po liście odnosi się do id obiektu

var nestedobj = a => Object.fromEntries(Object.values(a).map(v => [`list${v.id}`, v]));

var list= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"}
]

var list1= [
  {id: 1, cn: "SG"},
  {id: 2, cn: "TH"},
  {id: 3, cn: "MY"}
]

var listobj = nestedobj(list);
var listobj1 = nestedobj(list1);
console.log(listobj)
console.log(listobj1)
0
Jaromanda X 3 kwiecień 2020, 09:27