Независимо от того, нужны ли ключи для ввода значений в массив

#javascript #jquery

Вопрос:

Здесь ключи могут быть динамичными. поэтому мне нужно получать значения только независимо от ключей.

 var test = []
var arrayObj = [
  {
    "abc": {
        "value": "1"
    },
    "def": {
        "value": "TERN"
    },
    "aec": {
        "value": "SASU"
    },
    "rtg": {
        "value": "FI"
    },
    "ttyg": {
        "value": "9"
    },
    "yty": {
        "value": "uyMFG"
    }
},

 {
    "abc": {
        "value": "1"
    },
    "def": {
        "value": "EXT"
    },
    "aec": {
        "value": "SAM"
    },
    "rtg": {
        "value": "FINISH"
    },
    "ttyg": {
        "value": "5"
    },
    "yty": {
        "value": "MFG"
    }
}]
function printValues(obj) {
    for (var key in obj) {
        if (typeof obj[key] === "object") {
            printValues(obj[key]);   
        } else {
           test.push(obj[key])
        }

    }
        

}
printValues(arrayObj);

    console.log(test); 

Я получаю это

 ["1","TERN","SASU","FI","9","uyMFG","1","EXT","SAM","FINISH","5","MFG"]
 

но мне нужно получить результат, как показано ниже

 [["1","TERN","SASU","FI","9","uyMFG"],["1","EXT","SAM","FINISH","5","MFG"]]
 

Правильно ли я поступаю или я могу найти лучший способ, чем мой подход ?
Пожалуйста, подскажите мне, как этого добиться. Я не знаю, где я ошибаюсь.

Комментарии:

1. Не уверен, что вы пытаетесь здесь сделать: даже если функция рекурсивна, она никогда не пытается отслеживать уровень рекурсии, приводя значения к одному и тому же результату, независимо от того, насколько глубоко (в парах) она находится сейчас. Вам вообще нужна рекурсия? Возможно, все обрабатываемые объекты всегда имеют одну и ту же структуру?

Ответ №1:

Если вам не особенно нужна рекурсивная функция, вы можете добиться этого с помощью некоторых Object Array методов и.

 var arrayObj=[{abc:{value:"1"},def:{value:"TERN"},aec:{value:"SASU"},rtg:{value:"FI"},ttyg:{value:"9"},yty:{value:"uyMFG"}},{abc:{value:"1"},def:{value:"EXT"},aec:{value:"SAM"},rtg:{value:"FINISH"},ttyg:{value:"5"},yty:{value:"MFG"}}];

const output = arrayObj.map(obj => {
  return Object.values(obj).map(({value}) => value)
})

console.log(output); 

Ответ №2:

В простейшей форме вы можете отобразить массив и вернуть карту объекта.значения().

Это предполагает, что глубина известна (как в примере) и value свойство согласовано

 const res = arrayObj.map(e => Object.values(e).map(o => o.value))

console.log(res) 
 <script>
   var arrayObj=[{abc:{value:"1"},def:{value:"TERN"},aec:{value:"SASU"},rtg:{value:"FI"},ttyg:{value:"9"},yty:{value:"uyMFG"}},{abc:{value:"1"},def:{value:"EXT"},aec:{value:"SAM"},rtg:{value:"FINISH"},ttyg:{value:"5"},yty:{value:"MFG"}}];
</script> 

Комментарии:

1. почему вы копируете мой ответ 😉

2. Спасибо 🙂 но @Nick дал ответ первым.. поэтому принял его ответ

3. @Ник Это было опубликовано только 2 минуты спустя, так что, скорее всего, он не видел вашего ответа.

Ответ №3:

Вы не должны использовать for..in массивы.

Используйте for..of на итерациях, таких как массив, строка и т. Д

Используйте for..in на объектах.

 var arrayObj = [
  {
    abc: { value: "1" },
    def: { value: "TERN" },
    aec: { value: "SASU" },
    rtg: { value: "FI" },
    ttyg: { value: "9" },
    yty: { value: "uyMFG" },
  },
  {
    abc: { value: "1" },
    def: { value: "EXT" },
    aec: { value: "SAM" },
    rtg: { value: "FINISH" },
    ttyg: { value: "5" },
    yty: { value: "MFG" },
  },
];
var test = [];
function printValues(arr) {
  for (var obj of arr) {
    const temp = [];
    for (let key in obj) {
      temp.push(obj[key].value);
    }
    test.push(temp);
  }
}
printValues(arrayObj);
console.log(test); 

Комментарии:

1. Спасибо 🙂 но @Nick дал ответ первым.. поэтому принял его ответ