assign-where
v2.0.1
Published
Like Object.assign, but use a function to determine if a key/value will be assigned
Downloads
5
Readme
assign-where
Like Object.assign
, but key/value assigning is determined by a predicate function
Installation
npm install assign-where --save
API
assignWhere( predicate, target, [sources]);
Arguments:
predicate
(function): Takes an array[key, value]
, and returns bool, This determins if each enumerable key/value should be assigned totarget
target
(enumerable): The value to be assigned onto (to be mutated)[sources]
(enumerables): The source values
NOTE: Like Object.assign, assignWhere will attempted to coerce target and sources to objects
Examples
On key
import assignWhere from 'assign-where';
const target = { existing: 'here'};
const output = assignWhere(
([key, value]) => key.startsWith('a'),
target,
{ apple: 'Manzana'},
{ bannana: 'Banano'},
{ crab: 'crangrejo'}
);
console.log(output);
// { existing: "here", apple: "Manzana" }
console.log(target === output);
// true
On value
import assignWhere from 'assign-where';
const target = { existing: 'here'};
const output = assignWhere(
([key, value]) => value.endsWith('o'),
target,
{ apple: 'Manzana'},
{ bannana: 'Banano'},
{ crab: 'crangrejo'}
);
console.log(output);
// { existing: "here", bannana: "Banano", crab: "crangrejo" }
console.log(target === output);
// true
Alternative
Use in-built functions
let target = { existing: 'here'};
Object
.entries(
Object.assign(
{ apple: 'Manzana'},
{ bannana: 'Banano'},
{ crab: 'crangrejo'}
)
).filter(
([key, value]) => value.endsWith('o')
).forEach(
([key, value]) => target[key] = value
);
console.log(target);
// { existing: "here", bannana: "Banano", crab: "crangrejo" }
Why?
The initial use case was in React, wanting to examine a Component's props and find all the custom data attributes data-
.
const dataAttr = ([k,v]) => k.startsWith('data-')
const MyComp = props =>
<div
{...assignWhere(dataAttr, props)}
>
<h1>{props.heading}</h1>
<p>{props.content}</p>
</div>
ReactDOM.render(
<MyComp data-test data-x data-y />,
document.getElementById('root')
);
document.querySelector('[data-test]']); // Works
Notes
- Based on
Object.assign
(target
is mutated), andArray.filter
sources
ofnull
andundefined
are ignored (likeObject.assign
)predicate
params based on output ofObject.entries
- Uses rollupjs & babeljs to build a commonjs module
bundle.js
fromsrc/main.js
NPM commands
Tests
npm test
Dev
npm run dev
Build
npm run build