выбор Lodash: установите значение по умолчанию, если ключ не установлен

#javascript #lodash

#javascript #Lodash

Вопрос:

У меня есть следующие два массива:

 var header = [{"user":"test"},{"name":"dummy"},{"age":0},{"address":""}];

var resultsArr = [
    { user:"test1", name: "test1", age: 23, unrelatedKey: "hello" },
    { user:"test2", name: "test2", surname: "test12" }
]  

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

 [
    { user:"test1", name: "test1", age: 23, address: "" },
    { user:"test2", name: "test2", age: 0, address: "" },
]  

Я хочу использовать его в следующем коде:

 var result = resultsArr.map(function(obj) {
  return _(obj)
    .pick(Object.keys(header))
    .defaults(defaultsObj)
    .value();
});  

Спасибо!!!

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

1. заголовок — это массив. Вы не можете использовать Object.keys для него. Попробуйте выполнить цикл по заголовку.

Ответ №1:

Я думаю, все понятно из приведенного ниже кода

 const header = [{"user":"test"},{"name":"dummy"},{"age":0},{"address":""}];

const resultsArr = [
    { user:"test1", name: "test1", age: 23, unrelatedKey: "hello" },
    { user:"test2", name: "test2", surname: "test12" }
]

const headerUnited = Object.assign({}, ...header)
const keys = Object.keys(headerUnited)

const result = resultArr.map(v => 
  _.pick({...headerUnited, ...v}, keys)
)
  

Ответ №2:

 var header = [{
  "user": "test"
}, {
  "name": "dummy"
}, {
  "age": 0
}, {
  "address": ""
}];

var resultsArr = [{
    user: "test1",
    name: "test1",
    age: 23,
    unrelatedKey: "hello"
  },
  {
    user: "test2",
    name: "test2",
    surname: "test12"
  }
]

const headerKeys = _.flatten(_.map(header, item => _.keys(item)));

/*
[
    { user:"test1", name: "test1", age: 23, address: "" },
    { user:"test2", name: "test2", age: 0, address: "" },
]
*/

const output = _.map(resultsArr, obj => {
  return _.map(headerKeys, item => {
    return {
      [item]: obj[item] ? obj[item] : ''
    }
  })
})

console.log(output)  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>  

Ответ №3:

Вы могли бы продолжить свой текущий подход, всего лишь несколько изменений

 const header = [
  { user: "test" },
  { name: "dummy" },
  { age: 0 },
  { address: "" },
]

const resultsArr = [
  { user: "test1", name: "test1", age: 23, unrelatedKey: "hello" },
  { user: "test2", name: "test2", surname: "test12" },
]

const res = _(resultsArr)
  .map((obj) => _.pick(obj, _.flatMap(header, _.keys)))
  .map((obj) => _.defaults(obj, ...header))
  .value()

console.log(res)  
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>  

Ответ №4:

Ваша идея звучит. Чтобы заставить его работать, создайте defaultsObj путем объединения объектов заголовков в один объект — const defaultsObj = _.merge({}, ...header);

А затем используйте _.keys() of defaultObj , чтобы выбрать только соответствующие элементы из исходных объектов:

 var header = [{"user":"test"},{"name":"dummy"},{"age":0},{"address":""}];

var resultsArr = [
  { user:"test1", name: "test1", age: 23, unrelatedKey: "hello" },
  { user:"test2", name: "test2", surname: "test12" }
]

const defaultsObj = _.merge({}, ...header);

var result = resultsArr.map(function(obj) {
  return _(obj)
    .pick(_.keys(defaultsObj)) // use the defaultsObj keys
    .defaults(defaultsObj) // use the defaultsObj
    .value();
});

console.log(result);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>  

Ответ №5:

Вы можете создать массив, содержащий ключи, header и map resultsArr изменить объекты внутри него :

 var header = [{
  user: "test"
}, {
  name: "dummy"
}, {
  age: 0
}, {
  address: ""
}];

var resultsArr = [{
    user: "test1",
    name: "test1",
    age: 23,
    unrelatedKey: "hello"
  },
  {
    user: "test2",
    name: "test2",
    surname: "test12"
  }
];

const keys = header.map((o) => Object.keys(o)[0]);

const result = resultsArr.map((obj) => {
  return keys.reduce((acc, curr) => {
    acc[curr] = obj[curr];
    return acc;
  }, {});
}, []);

console.log(result);