Javascript 包含对象数组和字符串数组的对象
我有一个像这样的对象:Javascript 包含对象数组和字符串数组的对象,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个像这样的对象: var obj = { "array1": [ {"label": "something1", "ref": "option2a"}, {"label": "something2", "ref": "option2b"}, {"label": "something3", "ref": "option2a"}, {"label": "something4", "ref": "option2a"}, {"label": "somet
var obj = {
"array1": [
{"label": "something1", "ref": "option2a"},
{"label": "something2", "ref": "option2b"},
{"label": "something3", "ref": "option2a"},
{"label": "something4", "ref": "option2a"},
{"label": "something5 is the longest", "ref": "option2a"}
],
array2: [
"arrayItem1",
"array Item 2"
]
}
此对象包含对象数组和字符串数组。我想遍历每个有标签的对象并返回最长的标签。在上一个示例中,预期的输出id为:
“something5是最长的。”
我尝试了以下方法:
function getLongest(object, key) {
return Object.values(object).reduce((l, v) => {
if (object.hasOwnProperty(key)) {
if (key in v)
return Math.max(l, v[key].length);
if (v && typeof v === 'object')
return Math.max(l, getLongest(v, key));
return l;
}
}, 0);
}
但是,这给了我一个错误,因为它找不到array2
中项目的属性标签
//对象声明
var obj={
“阵列1”:[{
“标签”:“某物1”,
“参考”:“选项2A”
},
{
“标签”:“某物2”,
“参考”:“选项2B”
},
{
“标签”:“某物3”,
“参考”:“选项2A”
},
{
“标签”:“某物4”,
“参考”:“选项2A”
},
{
“标签”:“某物5是最长的”,
“参考”:“选项2A”
}
],
阵列2:[
“arrayItem1”,
“数组项2”
]
};
//迭代obj中的所有项
for(obj中的var propertyName){
//如果项是对象且是数组
if(对象的类型[propertyName]=='object'&&Array.isArray(对象[propertyName])){
//如果数组至少有一个项和label属性
if(obj[propertyName].length>0&&typeof obj[propertyName][0].label!=“未定义”){
//按标签长度对数组排序
obj[propertyName]。排序((a,b)=>(a.label.length 控制台日志(obj)
自从您提到jQuery
以来,我已经包含了一个解决方案,该解决方案用于迭代外部对象,并从obj
中的每个数组值只生成一个结果
var obj={
“阵列1”:[{
“标签”:“某物1”,
“参考”:“选项2A”
},
{
“标签”:“某物2”,
“参考”:“选项2B”
},
{
“标签”:“某物3”,
“参考”:“选项2A”
},
{
“标签”:“某物4”,
“参考”:“选项2A”
},
{
“标签”:“某物5是最长的”,
“参考”:“选项2A”
}
],
阵列2:[
“arrayItem1”,
“数组项2”
]
}
函数getLongest(curr,next){
return!Object.keys(next).includes(“label”)| | curr.label.length>next.label.length?curr:next;
}
var reduced=$.map(obj,item=>item.reduce(getLongest,{“label”:“}))
控制台日志(减少)代码>
这里有一种方法,它在对象上使用了过时的reduce()
方法。Values()
:
var obj={
“阵列1”:[
{“label”:“something1”,“ref”:“option2a”},
{“label”:“something2”,“ref”:“option2b”},
{“label”:“something3”,“ref”:“option2ahgf”},
{“label”:“something4”,“ref”:“option2a”},
{“label”:“我不是最长的”,“ref”:“option2a”}
],
阵列2:[
“arrayItem1”,
{“label”:“something5是最长的”,“ref”:“option2a”},
“数组项2”
],
阵列3:[
{“label”:“somethingX”,“ref”:“option2X”},
{“label”:“somethingY”,“ref”:“option2Y”}
]
}
const getLongest=(对象,键)=>
{
设r=Object.values(obj).reduce((res,curr)=>
{
如果(!Array.isArray(curr))
返回res;
让newMax=curr.reduce(
(r,c)=>c[[key]]和&(c[[key]]长度>r.length)?c[[key]]:r,
""
);
res=newMax.length>res.length?newMax:res;
返回res;
}, "");
返回r;
}
log(getLongest(obj,label));
日志(getLongest(obj,“ref”))代码>我不认为OP真的想对它们进行排序。只需返回具有最长值的标签即可。`我想对每个具有标签的对象进行排序,并返回最长的标签。在本例中,它将返回“something5是最长的”`@SunnyPatel“sortthreach”可以被视为“iterathreach”。就像在“整理文件”中一样,你会“整理”它们。@Mandalina,“array1”和“array2”是不是可以相互比较?分别地或者只使用带有“label”键的数组(例如“array1”)?嘿@SunnyPatel是的,我只需要获得带有“label”键的数组;就像array1一样,我只是更新了它,将逻辑封装在函数中,并对其进行了进一步的概括。