Группировать элементы массива, используя объект в Javascript - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующий код:

const temp = {
  "address.addr1": "Some value 1",
  "address.addr2": "Some value 2",
  "qual.qual1": "Some value 1",
  "qual.qual2": "Some value 2",
  "gender": "Male"
}

let finalVal = {};

transformValues(temp);

function splitKeys(value) {
  const splitValues = value.split('.');
  console.log(splitValues)

}

function transformValues(values) {

  const keys = Object.keys(values);
  keys.forEach(key => {
    splitKeys(key);
  });
}

Мне бы хотелось, чтобы выходные данные имели следующий формат:

let finalVal = {
    address: {
    addr1: "Some value 1",
    addr2: "Some value 2"
  },
  qual: {
    qual1: "Some value 1",
    qual2: "Some value 2"
  },
  gender: "Male"
}

Пожалуйста, помогите мне использовать JavaScript для поддержки вывода, как указано выше.Я пытался использовать lodash, split и slice, но я не смог взломать этот вывод.


Ответы [ 7 ]

0 голосов
/ 18 сентября 2018

Другое решение, которое работает для любого уровня:

var temp = {
  "address.addr1": "Some value 1",
  "address.addr2": "Some value 2",
  "qual.qual1": "Some value 1",
  "qual.qual2": "Some value 2",
  "gender": "Male"
};

var res = Object.entries(temp).reduce((m, [keys, value]) => {
    var curr = m;
    keys.split('.').forEach((key, i, self) => curr = curr[key] = i === self.length - 1 ? value : curr[key] || {});
    return m;
}, {});

console.log(res);
0 голосов
/ 18 сентября 2018

Не забудьте вернуть ваши значения из функции. В противном случае он вернет неопределенное. Я думаю, вы должны изучить сферу и функции.

https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Functions

А вот альтернативное решение вашей проблемы.

const temp = {
  "address.addr1": "Some value 1",
  "address.addr2": "Some value 2",
  "qual.qual1": "Some value 1",
  "qual.qual2": "Some value 2",
  "gender": "Male"
}    

function splitKeys(value) {
  const splitValues = value.split('.');

  // return splited values as an array
  return splitValues;
}

function transformValues(values) {
  // create new object
  let obj = {};

  const keys = Object.keys(values);
  keys.forEach(key => {
    const [rootKey, branchKey] = splitKeys(key);
    // assign empty object if obj[rootKey] is empty
    if(obj[rootKey] === undefined) { obj[rootKey] = {}; }
    // this will format the obj as you wanted
    if(branchKey === undefined){
      obj[rootKey] = values[key]; 
    } else {
      obj[rootKey][branchKey] = values[key]; 
    }
  });

  return obj;
}

console.log(temp);
console.log(transformValues(temp));
0 голосов
/ 18 сентября 2018

Попробуйте этот код

const temp = {
    "address.addr1": "Some value 1",
    "address.addr2": "Some value 2",
    "qual.qual1": "Some value 1",
    "qual.qual2": "Some value 2",
    "gender": "Male"
};

let finalVal = {};

Object.keys(temp).forEach((key) => {
    const array = key.split('.');
    if(array.length > 1){
        if(finalVal[array[0]])
            finalVal[array[0]][array[1]] = temp[key];
        else
            finalVal[array[0]] = { [array[1]] : temp[key] }
    }
    else {
        finalVal[array[0]] =  temp[key];
    }
});
console.log(finalVal)
0 голосов
/ 18 сентября 2018

const temp = {
    "address.addr1": "Some value 1",
    "address.addr2": "Some value 2",
    "qual.qual1": "Some value 1",
    "qual.qual2": "Some value 2",
    "gender": "Male"
}
  
let finalVal = transformValues(temp);
console.log(finalVal);

function transformValues(values) {
    const result = {};
    Object.keys(values).forEach(key => {
        let temp = result;
        const splits = key.split('.');
        for (let i = 0; i < splits.length - 1; i++) {
            temp = temp[splits[i]] = temp[splits[i]] || {};
        }
        temp[splits.pop()] = values[key];
    });
    return result;
}
0 голосов
/ 18 сентября 2018

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

Работает на любую глубину.

function setValue(object, path, value) {
    var last = path.pop();
    path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
    return object;
}

var temp = { "the.ultimate.question": 42, "address.addr1": "Some value 1", "address.addr2": "Some value 2", "qual.qual1": "Some value 1", "qual.qual2": "Some value 2", "gender": "Male" },
    finalVal = {};

Object
    .entries(temp)
    .forEach(([k, v]) => setValue(finalVal, k.split('.'), v));

console.log(finalVal);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 18 сентября 2018

Вы можете использовать Array.reduce и Object.entries

const temp = {"address.addr1": "Some value 1","address.addr2": "Some value 2","qual.qual1": "Some value 1","qual.qual2": "Some value 2","gender": "Male"};

// For each key/value pair in object populate the resultant object
const result = Object.entries(temp).reduce((a,[k,v]) => {
  populateObject(a, k, v);
  return a;
}, {});

// function that traverses the hierarchy in object and add the value
function populateObject(obj, k, v) {
  if(k.includes(".")) {
    let keys = k.split(".");
    let key = keys.shift();
    obj[key] = obj[key] || {};
    populateObject(obj[key], keys.join("."), v);
  } else obj[k] = v;
}
console.log(result);
0 голосов
/ 18 сентября 2018

Вы можете использовать reduce над entries ввода, проверяя, есть ли у клавиши точка или нет.Если это так, назначьте соответствующий вложенный ключ в аккумуляторе, сначала создавая внешний объект, если это необходимо.

const temp = {
	"address.addr1": "Some value 1",
  "address.addr2": "Some value 2",
  "qual.qual1": "Some value 1",
  "qual.qual2": "Some value 2",
  "gender": "Male"
}
const finalVal = Object.entries(temp).reduce((a, [key, val]) => {
  if (!key.includes('.')) {
    a[key] = val;
    return a;
  }
  const [outerProp, innerProp] = key.split('.');
  if (!a[outerProp]) a[outerProp] = {};
  a[outerProp][innerProp] = val;
  return a;
}, {});
console.log(finalVal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...