#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);