Parse keypath to array item from string












-1















How can I parse a string like this ""0.children.13.children.0" to the path to the array item in JavaScript?
Example: "0.children.13.children.0" > arr[0].children[13].children[0]
Thanks in advance!










share|improve this question

























  • Which language are you using?

    – Ankit Agarwal
    Nov 19 '18 at 6:54











  • I use Javascript

    – Danny White
    Nov 19 '18 at 6:56











  • why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

    – Thomas
    Nov 19 '18 at 7:25













  • Thank you! Using split function is very useful in this case

    – Danny White
    Nov 19 '18 at 11:09
















-1















How can I parse a string like this ""0.children.13.children.0" to the path to the array item in JavaScript?
Example: "0.children.13.children.0" > arr[0].children[13].children[0]
Thanks in advance!










share|improve this question

























  • Which language are you using?

    – Ankit Agarwal
    Nov 19 '18 at 6:54











  • I use Javascript

    – Danny White
    Nov 19 '18 at 6:56











  • why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

    – Thomas
    Nov 19 '18 at 7:25













  • Thank you! Using split function is very useful in this case

    – Danny White
    Nov 19 '18 at 11:09














-1












-1








-1








How can I parse a string like this ""0.children.13.children.0" to the path to the array item in JavaScript?
Example: "0.children.13.children.0" > arr[0].children[13].children[0]
Thanks in advance!










share|improve this question
















How can I parse a string like this ""0.children.13.children.0" to the path to the array item in JavaScript?
Example: "0.children.13.children.0" > arr[0].children[13].children[0]
Thanks in advance!







javascript arrays parsing






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 '18 at 9:40









Ashish Kamble

632519




632519










asked Nov 19 '18 at 6:54









Danny WhiteDanny White

11




11













  • Which language are you using?

    – Ankit Agarwal
    Nov 19 '18 at 6:54











  • I use Javascript

    – Danny White
    Nov 19 '18 at 6:56











  • why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

    – Thomas
    Nov 19 '18 at 7:25













  • Thank you! Using split function is very useful in this case

    – Danny White
    Nov 19 '18 at 11:09



















  • Which language are you using?

    – Ankit Agarwal
    Nov 19 '18 at 6:54











  • I use Javascript

    – Danny White
    Nov 19 '18 at 6:56











  • why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

    – Thomas
    Nov 19 '18 at 7:25













  • Thank you! Using split function is very useful in this case

    – Danny White
    Nov 19 '18 at 11:09

















Which language are you using?

– Ankit Agarwal
Nov 19 '18 at 6:54





Which language are you using?

– Ankit Agarwal
Nov 19 '18 at 6:54













I use Javascript

– Danny White
Nov 19 '18 at 6:56





I use Javascript

– Danny White
Nov 19 '18 at 6:56













why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

– Thomas
Nov 19 '18 at 7:25







why don't you just split(".")? Now you have all the keys and you can resolve the value var value = path.split(".").reduce((obj,key) => obj[key], arr);

– Thomas
Nov 19 '18 at 7:25















Thank you! Using split function is very useful in this case

– Danny White
Nov 19 '18 at 11:09





Thank you! Using split function is very useful in this case

– Danny White
Nov 19 '18 at 11:09












1 Answer
1






active

oldest

votes


















0














Using one string and split it on . could break if your objects have dots in their keys like {'first.name':'John'} so it would probably better to provide an array with strings/ints instead.



Here is an implementation of lodash get with the difference that it only takes path as string:






var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);








share|improve this answer
























  • Thanks very much! It helped me!

    – Danny White
    Nov 19 '18 at 11:08











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369658%2fparse-keypath-to-array-item-from-string%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














Using one string and split it on . could break if your objects have dots in their keys like {'first.name':'John'} so it would probably better to provide an array with strings/ints instead.



Here is an implementation of lodash get with the difference that it only takes path as string:






var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);








share|improve this answer
























  • Thanks very much! It helped me!

    – Danny White
    Nov 19 '18 at 11:08
















0














Using one string and split it on . could break if your objects have dots in their keys like {'first.name':'John'} so it would probably better to provide an array with strings/ints instead.



Here is an implementation of lodash get with the difference that it only takes path as string:






var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);








share|improve this answer
























  • Thanks very much! It helped me!

    – Danny White
    Nov 19 '18 at 11:08














0












0








0







Using one string and split it on . could break if your objects have dots in their keys like {'first.name':'John'} so it would probably better to provide an array with strings/ints instead.



Here is an implementation of lodash get with the difference that it only takes path as string:






var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);








share|improve this answer













Using one string and split it on . could break if your objects have dots in their keys like {'first.name':'John'} so it would probably better to provide an array with strings/ints instead.



Here is an implementation of lodash get with the difference that it only takes path as string:






var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);








var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);





var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);






share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 19 '18 at 8:22









HMRHMR

13.7k113898




13.7k113898













  • Thanks very much! It helped me!

    – Danny White
    Nov 19 '18 at 11:08



















  • Thanks very much! It helped me!

    – Danny White
    Nov 19 '18 at 11:08

















Thanks very much! It helped me!

– Danny White
Nov 19 '18 at 11:08





Thanks very much! It helped me!

– Danny White
Nov 19 '18 at 11:08


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53369658%2fparse-keypath-to-array-item-from-string%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)