1

Seeking the below result with dynamic list of object using javascript. Defined approach getting me undefined index of value.

Javascript Code

var obj = {};
var obj_ = {
  "clist_1": "abc",
  "clist_2": "def",
  "branch_1": "efg"
}
for (let key in obj_) {
  if (key.includes("clist_")) {
    let num = key.replace(/^\D+/g, '');
    obj[num] = obj_.key;
  }
}

console.log(obj)

Desired Result

{
  "1": "abc",
  "2": "def"
}
Azzabi Haythem
  • 2,318
  • 7
  • 26
  • 32
Query Master
  • 6,989
  • 5
  • 35
  • 58

4 Answers4

3

You can use bracket notation. You need to do obj_[key] and not obj_.key.

var obj = {};
var obj_ = {
  "clist_1": "abc",
  "clist_2": "def",
  "branch_1": "efg"
}
for (let key in obj_) {
  if (key.includes("clist_")) {
    let num = key.replace(/^\D+/g, '');
    obj[num] = obj_[key];
  }
}

console.log(obj)
R3tep
  • 12,512
  • 10
  • 48
  • 75
1

You need a property accessor in bracket notation for the key.

obj[num] = obj_[key];
//             ^^^^^

Then you could use startsWith instead of includes for checking the starting part of a string.

var obj = {};
var obj_ = {
  "clist_1": "abc",
  "clist_2": "def",
  "branch_1": "efg"
}
for (let key in obj_) {
  if (key.startsWith("clist_")) {
    let num = key.replace(/^\D+/g, '');
    obj[num] = obj_[key];
  }
}

console.log(obj);
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
0

Alternative chain way:

var obj = {};
var obj_ = {
  "clist_1": "abc",
  "clist_2": "def",
  "branch_1": "efg"
};

Object.keys(obj_)
    .map(key=>key.replace(/^\D+/g, ''))
    .map(key=>obj[key]=obj_[key]);

console.log(obj);
Zydnar
  • 1,472
  • 18
  • 27
0

You can do:

const obj_ = {"clist_1": "abc","clist_2": "def","branch_1": "efg"};
const obj = Object.keys(obj_)
  .filter(k => k.startsWith('clist_'))
  .reduce((a, c) => (a[c.match(/\d+/g)] = obj_[c], a), {});
  
console.log(obj);
Yosvel Quintero
  • 18,669
  • 5
  • 37
  • 46