Объект массива объектов. Получить длину всех значений с тем же свойством - PullRequest
0 голосов
/ 10 января 2019

У меня есть объект, который выглядит так:

    var obj = {
      "array1": [
        {
          "label": "something1",
          "ref": "option2a"
        },
        {
          "label": "something2",
          "ref": "option2b"
        },
        {
          "label": "something3",
          "ref": "option2a"
        },
        {
          "label": "something4",
          "ref": "option2a"
        },
        {
          "label": "something5",
          "ref": "option2a"
        }
      ],
      "array2": [
        {
          "label": "something6 is the longest label",
          "ref": "option3a"
        },
        {
          "label": "Other",
          "ref": "option3b"
        }
      ]
    }

Я хочу получить длину самого длинного ярлыка. В этом случае я бы хотел вернуть 17. Поскольку самая длинная метка - это «нечто длинное», длина которой составляет 17 *.

Ответы [ 6 ]

0 голосов
/ 10 января 2019

Вы можете использовать это утверждение в 1 строку.

let maxLen = Math.max(...Object.keys(obj).map((key) => Math.max(...obj[key].map((o) => o.label.length))));

Пример на узле REPL

> var obj = {
...       "array1": [
...         {
.....           "label": "something1",
.....           "ref": "option2a"
.....         },
...         {
.....           "label": "something2",
.....           "ref": "option2b"
.....         },
...         {
.....           "label": "something3",
.....           "ref": "option2a"
.....         },
...         {
.....           "label": "something4",
.....           "ref": "option2a"
.....         },
...         {
.....           "label": "something5",
.....           "ref": "option2a"
.....         }
...       ],
...       "array2": [
...         {
.....           "label": "somethinglongest",
.....           "ref": "option3a"
.....         },
...         {
.....           "label": "Other",
.....           "ref": "option3b"
.....         }
...       ]
...     }
undefined
>
> Math.max(...Object.keys(obj).map((key) => Math.max(...obj[key].map((o) => o.label.length))))
16
>

Подробный обзор

let keys = Object.keys(obj);

let maxLens = keys.map((key) => {
    let arr = obj[key];
    return Math.max(...arr.map((o) => o.label.length))
});

let max = Math.max(...maxLens);

console.log(keys);    // [ 'array1', 'array2' ]
console.log(maxLens); // [ 10, 16 ]
console.log(max);     // 16

А вот пример, чтобы помочь вам.

> Math.max(4, 5, 7)
7
>
> Math.max([4, 5, 7])
NaN
>
> Math.max(...[6, 7])
7
>
> let a = [2, 4, 5]
undefined
>
> a2 = a.map((num) => num ** 2)
[ 4, 16, 25 ]
>
> a3 = a.map((num) => num + 2)
[ 4, 6, 7 ]
>
0 голосов
/ 10 января 2019

Прямой подход:

let obj = {
      "array1": [
        {"label": "something1", "ref": "option2a"},
        {"label": "something2", "ref": "option2b"},
        {"label": "something3", "ref": "option2a"},
        {"label": "something4", "ref": "option2a"},
        {"label": "something5", "ref": "option2a"}
      ],
      "array2": [
        {"label": "something6 is the longest label", "ref": "option3a"},
        {"label": "Other", "ref": "option3b"}
      ]
};

let longest = 0
for (key in obj){
    if (!obj.hasOwnProperty(key)) continue;
    for (let x of obj[key]){
        if (x.label.length > longest)
            longest = x.label.length;
    }
}
console.log(longest);
0 голосов
/ 10 января 2019

Вы можете искать объекты, а затем найти нужный ключ. Это работает для произвольной глубины данных.

function getLongest(object, key) {
    return Object.values(object).reduce((l, v) => {
        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);
}

var data = { array1: [{ label: "something1", ref: "option2a" }, { label: "something2", ref: "option2b" }, { label: "something3", ref: "option2a" }, { label: "something4", ref: "option2a" }, { label: "something5", ref: "option2a" }], array2: [{ label: "somethinglongest", ref: "option3a" }, { label: "Other", ref: "option3b" }] };

console.log(getLongest(data, 'label'));
0 голосов
/ 10 января 2019

Другой вариант - выполнить итерацию по собственным свойствам объекта obj и проверить, больше ли длина каждой метки, чем предыдущая самая длинная длина.

var obj = {
  "array1": [
    { "label": "something1", "ref": "option2a" },
    { "label": "something2", "ref": "option2b" },
    { "label": "something3", "ref": "option2a" },
    { "label": "something4", "ref": "option2a" },
    { "label": "something5", "ref": "option2a" }
  ], "array2": [ 
    { "label": "somethinglongest", "ref": "option3a" },
    { "label": "Other", "ref": "option3b" }
  ]
}

let longest = 0;

for (key in obj) {
  if(obj.hasOwnProperty(key)) {
    obj[key].forEach(item => {
      if (item.label.length > longest) longest = item.label.length;
    })
  }
}

console.log(longest);
0 голосов
/ 10 января 2019

Получить массив всех объектов внутри вложенных массивов.

Рассчитайте максимальную длину значений, сопоставляющих каждое значение его длине:

var obj = {
  "array1": [{
      "label": "something1",
      "ref": "option2a"
    },
    {
      "label": "something2",
      "ref": "option2b"
    },
    {
      "label": "something3",
      "ref": "option2a"
    },
    {
      "label": "something4",
      "ref": "option2a"
    },
    {
      "label": "something5",
      "ref": "option2a"
    }
  ],
  "array2": [{
      "label": "somethinglongest",
      "ref": "option3a"
    },
    {
      "label": "Other",
      "ref": "option3b"
    }
  ]
};

console.log(Math.max(...Object.values(obj).flat().map(o => o.label.length)));
0 голосов
/ 10 января 2019
  • Используйте .concat() и Object.values(), чтобы получить один массив, содержащий все объекты.
  • Используйте .map() для массива, содержащего длину строк.
  • И, наконец, используйте .reduce(), чтобы получить длину самой длинной строки.

let data = {
    "array1": [
        {"label": "something1", "ref": "option2a"},
        {"label": "something2", "ref": "option2b"},
        {"label": "something3", "ref": "option2a"},
        {"label": "something4", "ref": "option2a"},
        {"label": "something5", "ref": "option2a"}
    ],
    "array2": [
        {"label": "somethinglongest", "ref": "option3a"},
        {"label": "Other", "ref": "option3b"}
    ]
};

let reducer = arr => [].concat(...Object.values(arr))
                       .map(({ label }) => label.length)
                       .reduce((r, c) => r > c ? r : c);

console.log(reducer(data));
...