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一样,我只是更新了它,将逻辑封装在函数中,并对其进行了进一步的概括。