使用lodash按键自定义求和元素

时间:2019-02-04 19:16:26

标签: lodash

我确实有两个对象,其中包含像

var a = {bar:[1,2], foo:[7,9]}
var b = {bar:[2,2], foo:[3,1]}

我想得到令人失望的结果:

var c = {bar:[3,4], foo:[10,10]}

我已经有一个for逻辑,例如:

for (let key in b) {
  if (a[key]) {
      a[key][0] += b[key][0];
      a[key][1] += b[key][1];
  } 
  else a[key] = b[key];
}

但是我想以一种破旧的方式表达这种逻辑。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用create函数来接收n个对象,然后使用rest parameters将它们收集到一个数组中。现在,您可以将数组spread放入_.mergeWith()中以合并对象,并在定制器函数中使用Array.map()或lodash的_.map()和{{3}对数组中的项求和}:

const { mergeWith, isArray, map, add } = _

const fn = (...rest) => _.mergeWith({}, ...rest, (o = [], s) =>
  map(s, (n, i) => add(n, o[i]))
)

const a = {bar:[1,2], foo:[7,9]}
const b = {bar:[2,2], foo:[3,1]}
const c = {bar:[3,2], foo:[5,6]}
const d = {bar:[4,2], foo:[5,4]}

const result = fn(a, b, c, d)

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

您还可以使用_.add()创建一个函数,该函数将所有值合并到带有_.mergeAllWith()的多维数组中,然后使用_.zipAll()转置数组,并对每个数组求和:

const { rest, flow, mergeAllWith, isArray, head, mapValues, zipAll, map, sum } = _

const fn = rest(flow(
  mergeAllWith((o, s) => [...isArray(head(o)) ? o : [o], s]), // combine to a multidimensional array
  mapValues(flow(
    zipAll,
    map(sum)
  )),
))

const a = {bar:[1,2], foo:[7,9]}
const b = {bar:[2,2], foo:[3,1]}
const c = {bar:[3,2], foo:[5,6]}
const d = {bar:[4,2], foo:[5,4]}

const result = fn(a, b, c, d)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

答案 1 :(得分:1)

您可以使用带有String placeToSaveFile = "C:/path/to/your/project/"; Files.copy(theSelectedFile.toPath(), new File(placeToSaveFile).toPath(), StandardCopyOption.REPLACE_EXISTING); Object.entriesconcat的普通JavaScript来完成此操作:

reduce