gpt4 book ai didi

javascript - 指定属性返回它的js递归函数

转载 作者:行者123 更新时间:2023-11-30 11:02:08 25 4
gpt4 key购买 nike

我正在编写以下代码,指定属性必须返回它,即使它是 obj、array、string 或 number 类型也是如此。

我在更深入地恢复某些属性时遇到了一些问题。

我想在不使用外部模块的情况下执行此操作。

你能给我一些建议吗?

function returnElement(obj, label) {
let pointBool = label.includes(".");
let arrayOpenBool = label.includes("[");
let arrayCloseBool = label.includes("]");

//console.log(obj, label,arrayOpenBool && arrayCloseBool);

if (arrayOpenBool && arrayCloseBool) {
let start = label.split("[")[0];
let number = label.split("[")[1].split("]")[0];
let end = label.split("]")[0];
if (label.includes(".")) end = label.split(".")[1];
return obj[start][number]
? returnElement(obj[start][number], end)
: undefined;
}

if (pointBool) {
let start = label.split(".")[0];
let end = label.split(".")[1];
//console.log(obj, label, start, end, obj[end]);
if (start === "") return obj[end];
return returnElement(obj[start], end);
}

return obj[label];
}


var a = {
_id: "5d406a179f35ed326a6a5567",
age: 28,
name: {first: "James",last: "Bond"},
user: [{first: "Jon",last: "Witch"},{first: "Myra",last: "Navarro",number:[0,10]}]
};
var b = [];
b.push("item");//undefined
b.push("_id");//5d406a179f35ed326a6a5567
b.push("age");//28
b.push("name.first");//James
b.push("user[1]");//obj{}
b.push("user[1].first");//Myra
b.push("user[2].first");//undefined
b.push("user[1].email");//undefined
b.push("user[0].number");//[0, 1]
b.push("user[1].number[1]");//1

b.forEach(el => {
console.log(returnElement(a, el));
})

编辑:

这里还有一个额外的东西,考虑到@NinaScholz 提出的解决方案,它允许您根据更多参数对数据进行排序,如果它对某人有用的话。

基于以下解决方案:Link

let datatable = [
{
_id: '5d406a171ed43384972f04b5',
index: 0,
age: 28,
eyeColor: 'brown',
name: {
first: 'Myra',
last: 'Navarro',
},
company: 'SUSTENZA',
email: 'myra.navarro@sustenza.net',
},
{
_id: '5d406a170db0f4b04d9a9acf',
index: 1,
age: 23,
eyeColor: 'blue',
name: {
first: 'Harriett',
last: 'Tanner',
},
company: 'VALPREAL',
email: 'harriett.tanner@valpreal.com',
},
{
_id: '5d406a17e95da8ff80a759c5',
index: 2,
age: 39,
eyeColor: 'blue',
name: {
first: 'Vega',
last: 'Hanson',
},
company: 'BEDLAM',
email: 'vega.hanson@bedlam.tv',
},
{
_id: '5d406a175505da190e6875ec',
index: 3,
age: 31,
eyeColor: 'blue',
name: {
first: 'Rosemary',
last: 'Fields',
},
company: 'QUAILCOM',
email: 'rosemary.fields@quailcom.me',
},
{
_id: '5d406a17ea96044c027f4e50',
index: 4,
age: 27,
eyeColor: 'brown',
name: {
first: 'Dale',
last: 'Wilkinson',
},
company: 'QIAO',
email: 'dale.wilkinson@qiao.org',
},
{
_id: '5d406a17c5fff1ff6653a555',
index: 5,
age: 25,
eyeColor: 'blue',
name: {
first: 'Beatrice',
last: 'Contreras',
},
company: 'ZENOLUX',
email: 'beatrice.contreras@zenolux.us',
},
{
_id: '5d406a17a199efcba25e1f26',
index: 6,
age: 34,
eyeColor: 'blue',
name: {
first: 'Hancock',
last: 'Wynn',
},
company: 'PLASMOS',
email: 'hancock.wynn@plasmos.co.uk',
},
{
_id: '5d406a17019a2a4544a4f134',
index: 7,
age: 40,
eyeColor: 'blue',
name: {
first: 'Beatrice',
last: 'Aston',
},
company: 'SNACKTION',
email: 'beatrice.aston@snacktion.name',
},
{
_id: '5d406a17e516dd71af8210d4',
index: 8,
age: 39,
eyeColor: 'blue',
name: {
first: 'Barnes',
last: 'Dunn',
},
company: 'PORTALINE',
email: 'barnes.dunn@portaline.ca',
},
{
_id: '5d406a17516936a025b73c33',
index: 9,
age: 34,
eyeColor: 'green',
name: {
first: 'Blanche',
last: 'Cherry',
},
company: 'ISOSWITCH',
email: 'blanche.cherry@isoswitch.io',
},
{
_id: '5d406a17527a4d2c6a7897dd',
index: 10,
age: 33,
eyeColor: 'blue',
name: {
first: 'Gilliam',
last: 'Farley',
},
company: 'AMTAS',
email: 'gilliam.farley@amtas.biz',
},
{
_id: '5d406a175ff11478c416c30b',
index: 11,
age: 26,
eyeColor: 'brown',
name: {
first: 'Laura',
last: 'Short',
},
company: 'FISHLAND',
email: 'laura.short@fishland.info',
},
{
_id: '5d406a1738181b471847339a',
index: 12,
age: 20,
eyeColor: 'brown',
name: {
first: 'Moreno',
last: 'Barber',
},
company: 'KEENGEN',
email: 'moreno.barber@keengen.net',
},
{
_id: '5d406a17a6bcae6fe3ad1735',
index: 13,
age: 30,
eyeColor: 'brown',
name: {
first: 'Fischer',
last: 'French',
},
company: 'INCUBUS',
email: 'fischer.french@incubus.com',
},
{
_id: '5d406a17600ca53e8f63f263',
index: 14,
age: 30,
eyeColor: 'brown',
name: {
first: 'Donaldson',
last: 'Carr',
},
company: 'SUNCLIPSE',
email: 'donaldson.carr@sunclipse.tv',
},
{
_id: '5d406a17530655789a27174f',
index: 15,
age: 35,
eyeColor: 'green',
name: {
first: 'Sophia',
last: 'Payne',
},
company: 'PRISMATIC',
email: 'sophia.payne@prismatic.me',
},
{
_id: '5d406a175dbc687b4c7669d8',
index: 16,
age: 34,
eyeColor: 'green',
name: {
first: 'Simone',
last: 'Pollard',
},
company: 'DIGIGEN',
email: 'simone.pollard@digigen.org',
},
{
_id: '5d406a179f35ed326a6a5567',
index: 17,
age: 28,
eyeColor: 'green',
name: {
first: 'Yvette',
last: 'Daugherty',
},
company: 'CHILLIUM',
email: 'yvette.daugherty@chillium.us',
},
];

function getValue(object, path) {
return path
.replace(/\[/g, '.')
.replace(/\]/g, '')
.split('.')
.reduce((o, k) => (o || {})[k], object);
}

function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
var result = (getValue(a, property) < getValue(b, property)) ? -1 : (getValue(a, property) > getValue(b, property)) ? 1 : 0;
return result * sortOrder;
}
}

function dynamicSortMultiple() {
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
while(result === 0 && i < numberOfProperties) {
result = dynamicSort(props[i])(obj1, obj2);
i++;
}
return result;
}
}

function dynamicSortMultipleRic() {
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
while(result === 0 && i < numberOfProperties) result = dynamicSort(props[i++])(obj1, obj2);
return result;
}
}

var copyA = Object.assign([], datatable);
var copyB = Object.assign([], datatable);
var copyC = Object.assign([], datatable);

let a = copyA.sort(dynamicSort("name.first"));
let b = copyB.sort(dynamicSortMultiple("name.first","name.last"));
let c = copyC.sort(dynamicSortMultipleRic("name.first","name.last"));


console.log(a,b,c)

最佳答案

您可以替换括号并拆分字符串并从给定的对象中获取值。

function getValue(object, path) {
return path
.replace(/\[/g, '.')
.replace(/\]/g, '')
.split('.')
.reduce((o, k) => (o || {})[k], object);
}


var a = { _id: "5d406a179f35ed326a6a5567", age: 28, name: { first: "James", last: "Bond" }, user: [{ first: "Jon", last: "Witch" }, { first: "Myra", last: "Navarro", number: [0, 10] }] };

var b = [];

b.push("item");//undefined
b.push("_id");//5d406a179f35ed326a6a5567
b.push("age");//28
b.push("name.first");//James
b.push("user[1]");//obj{}
b.push("user[1].first");//Myra
b.push("user[2].first");//undefined
b.push("user[1].email");//undefined
b.push("user[1].number");//[0, 1]
b.push("user[1].number[1]");//1

b.forEach(el => {
console.log(getValue(a, el));
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 指定属性返回它的js递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com